如何通过Kotlin中的活动设置异步任务

时间:2019-01-09 20:15:19

标签: android kotlin android-asynctask

我有一个活动,该活动调用一个类并在该类中运行一个函数,如下所示:

        for (i in 0 until questions) {
            droll.droolCalls(sign)
        }

这有时可能会永远运行,因为它必须生成一堆随机数,因此我希望它能够在后台运行。我写了一个看起来像这样的AsyncTask:

class MyAsync(
    private val droll: CreateLayout,
    private val questions: Int, private val sign:Int,
    var progressBar: ProgressBar,
    var layoutProgress: LinearLayout,
    var layoutMain: LinearLayout
) :
    AsyncTask<String, Int, CreateLayout>() {


    var progress = 0
    override fun doInBackground(vararg params: String?): CreateLayout {
        for (i in 0 until questions) {
            droll.droolCalls(sign)
        }
        return droll
    }

    override fun onProgressUpdate(vararg values: Int?) {
        super.onProgressUpdate(*values)
        progressBar.incrementProgressBy(progress * 10)
    }

    override fun onPostExecute(result: CreateLayout?) {
        super.onPostExecute(result)
        layoutProgress.visibility = View.GONE
        layoutMain.visibility = View.VISIBLE
    }

}

但是,当我调用drollclass

MyAsync(droll, totalQuestions,sign, progressBar, Loading, mainLayout).execute("hello")

我从需要drool才能运行的其他功能中得到错误。

例如insert_point.addView(droll.makeTextView(numberOfQuestions - 1))的这个错误给了我一个java.lang.IndexOutOfBoundsException: Index: 2, Size: 0的错误,因为insert_point因为异步未运行而无法从droll获取数据?但是,如果我将其从异步for循环中删除,我们的异步效果会很好。

整个结构看起来像这样

class mainclass{

MyAsync(droll, totalQuestions,sign, progressBar, Loading, mainLayout).execute("hello")
insert_point.addView(droll.makeTextView(numberOfQuestions - 1))


class MyAsync(
    private val droll: CreateLayout,
    private val questions: Int, private val sign:Int,
    var progressBar: ProgressBar,
    var layoutProgress: LinearLayout,
    var layoutMain: LinearLayout
) :
    AsyncTask<String, Int, CreateLayout>() {


    var progress = 0
    override fun doInBackground(vararg params: String?): CreateLayout {
        for (i in 0 until questions) {
            droll.droolCalls(sign)
        }
        return droll
    }

    override fun onProgressUpdate(vararg values: Int?) {
        super.onProgressUpdate(*values)
        progressBar.incrementProgressBy(progress * 10)
    }

    override fun onPostExecute(result: CreateLayout?) {
        super.onPostExecute(result)
        layoutProgress.visibility = View.GONE
        layoutMain.visibility = View.VISIBLE
    }

}

}

1 个答案:

答案 0 :(得分:0)

    package www.binexmining.co.`in`.binexmining.binexmining.uam.view.activity

import android.app.Activity
import android.os.AsyncTask
import android.os.Bundle
import android.support.annotation.MainThread
import kotlinx.android.synthetic.main.row_referraluser.view.*
import www.binexmining.co.`in`.binexmining.R

class AsynTaskKotlinMain : Activity()
{

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_landing)
    }

    override fun onResume() {
        super.onResume()
        MyAssyn().execute("Pre-Executing Param Put here...","Param For Doinbackgroun")
    }

}

class  MyAssyn : AsyncTask<Any, Any, Any>()
{

    override fun onPreExecute() {
        super.onPreExecute()
    }

    override fun doInBackground(vararg params: Any?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onPostExecute(result: Any?) {
        super.onPostExecute(result)
    }
}