0
通常,我有一个AsyncTask
我想取消它。在其doInBackground
方法中,我有几个Thread.sleep
方法,他们之间我检查是否AsyncTask#cancel
与isCancelled()
调用。取消AsyncTask遇到Thread.sleep
这里的问题:如果我在doInBackground
方法有Thread.sleep
,该AsyncTask#onCancelled()
将不会被调用。如果所有Thread.sleep
都被删除,则调用AsyncTask#onCancelled()
。 什么使这发生
这是演示的定义。
inner class DemoAsyncTask() : AsyncTask<String, Int, String>() {
// var isRunning = true
override fun doInBackground(vararg params: String?): String? {
Log.i(TAG, "##AsyncTask doing something...")
var i = 0
val TOTAL = 100000000
var progress = 0
while (i < TOTAL && !isCancelled) {
Log.d(TAG, "doning jobs $i is cancelled $isCancelled")
i++
var currentProgress = i/TOTAL
if (currentProgress > progress) {
progress = currentProgress
publishProgress(progress)
}
}
Log.d(TAG, "doning jobs $i is cancelled $isCancelled")
return "Task done"
}
override fun onPostExecute(result: String?) {
[email protected]?.text = result
}
override fun onProgressUpdate(vararg values: Int?) {
mAsyncTextView?.text = "${mAsyncTextView?.text ?: "Async task..."} progress: ${values?.get(0) ?: 0}"
}
override fun onCancelled() {
Log.i(TAG, "##Task cancelled")
// isRunning = false
[email protected]?.text = "###Task cancelled"
}
}
这doInbackground
可以工作,这原来问题出在哪里发生的这个样子的:
if (isCancelled) {
var msg = mHandler.obtainMessage(THREAD_CANCELLED)
mHandler.sendMessage(msg)
return
}
Thread.sleep(2000)
if (isCancelled) {
var msg = mHandler.obtainMessage(THREAD_CANCELLED)
mHandler.sendMessage(msg)
return
}
var msg = mHandler.obtainMessage(THREAD_FINISHED)
mHandler.sendMessage(msg)
谢谢!