اندروید

آموزش AsyncTask در کوتلین

آموزش AsyncTask در کوتلین

آموزش AsyncTask در کوتلین

سلام دوستان گرامی در این سری از آموزش برنامه نویسی کوتلین (Kotlin) به آموزش AsyncTask در کوتلین می پردازیم از AsyncTask به منظور انجام کارهای طولانی در background مورد استفاده قرار می گیرید در ادامه با ما همراه باشید تا نحوه پیاده سازی و استفاده از کلاس AsyncTask را یاد گیرید.

AsyncTask چیست ؟

هر زمان بخواهیم یک کاری طولانی مدتی را که ابتدا و انتهایی ندارد را انجام دهیم می توانیم از کلاس AsyncTask استفاده کنیم تا کارها در Background انجام شود و Ui اصلی Block یا گیر نکند. در واقع برای انجام کارها به صورت asynchronous است.

در ابتدای کار بهتر است وارد فایل AndroidManfest.xml شده و دسترسی زیر را به آن اضافه کنید.

<uses-permission android:name="android.permission.INTERNET"/>

در برنامه از سه کلاس استفاده شده است.

HttpURLConnection : به منظور دسترسی به لینک مورد استفاده قرار می گیرید.

BufferedReader : به منظور خواندن اطلاعات برگشتی از اینترنت.

JSONObject : به منظور پارس جی سان (Json)

در layout اصلی activity_main.xml کدهای زیر قرار دارد.

<?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 هم کدهای زیر قرار دارد.

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 استفاده می شود.

آموزش AsyncTask در کوتلین هم به پایان رسید.

موفق و پیروز باشید.

درباره محمد محسن خاشعی نژاد

بیش از ۱۰ سال است که به عنوان مدرس در حوزه های مختلف ICT فعالیت دارم و همیشه در حال یادگیری و یاد دادن هستم.

دیدگاهتان را بنویسید