آموزش AsyncTask در کوتلین
سلام دوستان گرامی در این سری از آموزش برنامه نویسی کوتلین (Kotlin) به آموزش AsyncTask در کوتلین می پردازیم از AsyncTask به منظور انجام کارهای طولانی در background مورد استفاده قرار می گیرید در ادامه با ما همراه باشید تا نحوه پیاده سازی و استفاده از کلاس AsyncTask را یاد گیرید.
AsyncTask چیست ؟
هر زمان بخواهیم یک کاری طولانی مدتی را که ابتدا و انتهایی ندارد را انجام دهیم می توانیم از کلاس AsyncTask استفاده کنیم تا کارها در Background انجام شود و Ui اصلی Block یا گیر نکند. در واقع برای انجام کارها به صورت asynchronous است.
در ابتدای کار بهتر است وارد فایل AndroidManfest.xml شده و دسترسی زیر را به آن اضافه کنید.
1 | <uses-permission android:name="android.permission.INTERNET"/> |
در برنامه از سه کلاس استفاده شده است.
HttpURLConnection : به منظور دسترسی به لینک مورد استفاده قرار می گیرید.
BufferedReader : به منظور خواندن اطلاعات برگشتی از اینترنت.
JSONObject : به منظور پارس جی سان (Json)
در layout اصلی activity_main.xml کدهای زیر قرار دارد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="81dp"> <TextView android:id="@+id/my_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="72dp" android:text="AsyncTask Example" android:textSize="18sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ProgressBar android:id="@+id/MyprogressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="32dp" android:visibility="invisible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/my_text" /> <Button android:id="@+id/CallBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="36dp" android:text="Execute AsyncTask" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/MyprogressBar" /> </android.support.constraint.ConstraintLayout> |
در بالا از Constraintlayout برای layout استفاده شده است شما می توانید آن را تغییر دهید از ProgressBar به منظور نمایش Progress و از دکمه برای انجام عمل request زدن به سرور استفاده شده است و TextView هم به منظور نمایش اطلاعات است.
در بخش MainActivity.kt هم کدهای زیر قرار دارد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | class MainActivity : AppCompatActivity() { private val tag: String = "MainActivity" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) CallBtn.setOnClickListener { AsyncTaskExample(this).execute() } } @SuppressLint("StaticFieldLeak") class AsyncTaskExample(private var activity: MainActivity?) : AsyncTask() { override fun onPreExecute() { super.onPreExecute() activity?.MyprogressBar?.visibility = View.VISIBLE } override fun doInBackground(vararg p0: String?): String { var result = "" try { val url = URL("http://demosmushtaq.16mb.com/api/get_sample.php?version_index=14") val httpURLConnection = url.openConnection() as HttpURLConnection httpURLConnection.readTimeout = 8000 httpURLConnection.connectTimeout = 8000 httpURLConnection.doOutput = true httpURLConnection.connect() val responseCode: Int = httpURLConnection.responseCode Log.d(activity?.tag, "responseCode - " + responseCode) if (responseCode == 200) { val tempStream: InputStream = httpURLConnection.inputStream result = convertToString(tempStream) } } catch (ex: Exception) { Log.d("", "Error in doInBackground " + ex.message) } return result } override fun onPostExecute(result: String?) { super.onPostExecute(result) activity?.MyprogressBar?.visibility = View.INVISIBLE if (result == "") { activity?.my_text?.text = activity?.getString(R.string.network_error) } else { var parsedResult = "" var jsonObject: JSONObject? = JSONObject(result) jsonObject = jsonObject?.getJSONObject("data") parsedResult += "Code Name : " + (jsonObject?.get("code_name")) + "\n" parsedResult += "Version Number : " + (jsonObject?.get("version_number")) + "\n" parsedResult += "API Level : " + (jsonObject?.get("api_level")) activity?.my_text?.text = parsedResult } } private fun convertToString(inStream: InputStream): String { var result = "" val isReader = InputStreamReader(inStream) val bReader = BufferedReader(isReader) var tempStr: String? try { while (true) { tempStr = bReader.readLine() if (tempStr == null) { break } result += tempStr } } catch (Ex: Exception) { Log.e(activity?.tag, "Error in convertToString " + Ex.printStackTrace()) } return result } } |
متد convertToString در واقع byte خوانده شده از سرور را به String تبدیل می کند زمانی که برنامه Request میزند برنامه وارد doInBackground شده و عمل دریافت اطلاعات رو انجام میدهد زماتی که اطلاعات آماده شود وارد متد onPostExecute شده و عمل پارس Json شروع می شود از متد execute مربوط به AsyncTask به منظور اجرای AsyncTask استفاده می شود.
این آموزش هم به پایان رسید.
موفق و پیروز باشید.