AsyncTask in Android with Kotlin

前端 未结 10 1527
离开以前
离开以前 2020-12-13 12:31

How to make an API call in Android with Kotlin?

I have heard of Anko . But I want to use methods provided by Kotlin like in Android we have Asynctask for background

10条回答
  •  醉酒成梦
    2020-12-13 13:07

    This is how I do in my projects to avoid memory leaks:

    I created an abstract base Async Task class for Async loading

    import android.os.AsyncTask
    
    abstract class BaseAsyncTask(private val listener: ProgressListener) : AsyncTask() {
    
        interface ProgressListener {
            // callback for start
            fun onStarted()
    
            // callback on success
            fun onCompleted()
    
            // callback on error
            fun onError(errorMessage: String?)
    
        }
    
        override fun onPreExecute() {
            listener.onStarted()
    
        }
    
        override fun onPostExecute(errorMessage: String?) {
            super.onPostExecute(errorMessage)
            if (null != errorMessage) {
                listener.onError(errorMessage)
            } else {
                listener.onCompleted()
            }
        }
    }
    

    USAGE:

    Now every time I have to perform some task in background, I create a new LoaderClass and extend it with my BaseAsyncTask class like this:

    class LoadMediaTask(listener: ProgressListener) : BaseAsyncTask(listener) {
    
        override fun doInBackground(vararg params: Void?): String? {
    
            return VideoMediaProvider().allVideos
        }
    }
    

    Now you can use your new AsyncLoader class any where in your app.

    Below is an example to Show/Hide progress bar & handle Error/ Success scenario:

       LoadMediaTask(object : BaseAsyncTask.ProgressListener {
                override fun onStarted() {
                    //Show Progrss Bar
                    loadingBar.visibility = View.VISIBLE
                }
    
                override fun onCompleted() {
                    // hide progress bar
                    loadingBar.visibility = View.GONE
                    // update UI on SUCCESS
                    setUpUI()
                }
    
                override fun onError(errorMessage: String?) {
                    // hide progress bar
                    loadingBar.visibility = View.GONE
                    // Update UI on ERROR
                    Toast.makeText(context, "No Videos Found", Toast.LENGTH_SHORT).show()
                }
    
            }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
    

提交回复
热议问题