Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否有AsyncTask的替代方案或如何重新启动AsyncTask?_Android_Android Asynctask - Fatal编程技术网

Android 是否有AsyncTask的替代方案或如何重新启动AsyncTask?

Android 是否有AsyncTask的替代方案或如何重新启动AsyncTask?,android,android-asynctask,Android,Android Asynctask,基于Android开发者的文档网页,可以将cancel()请求发送到AsyncTask的线程。虽然我已经发送了取消请求并且成功了,但是线程仍然在运行。有停止死刑的想法吗 button.setOnClickListener { Log.i(TAG, asyncTaskObj.status) // RUNNING if (asyncTaskObj.status == AsyncTask.Status.RUNNING) {

基于Android开发者的文档网页,可以将
cancel()
请求发送到
AsyncTask
的线程。虽然我已经发送了取消请求并且成功了,但是线程仍然在运行。有停止死刑的想法吗

    button.setOnClickListener {
      Log.i(TAG, asyncTaskObj.status)                       // RUNNING
      if (asyncTaskObj.status == AsyncTask.Status.RUNNING) {
         asyncTaskObj.cancel(true)
         Log.i(TAG, asyncTaskObj.isCancelled)               // True
      }
      Log.i(TAG, asyncTaskObj.status)                       // RUNNING
    }
另外,除了让我们重新启动线程执行的
AsyncTask
,还有什么简单的替代方法吗?(显然无法重新启动
AsyncTask

还有一件事,我读了以下问题。然而,这些答案对我来说并不适用。例如,没有
isRunning
变量


另外,我的密码是Kotlin。请在Java或Kotlin中分享您的想法。

像这样安全地从外部立即取消线程是不可能的。您不知道它可能正在运行什么操作,线程可能持有什么锁,等等。因此,取消实际上不会立即停止线程。它设置一个标志,AsyncTask的任务是检查标志并通过从doInBackground返回来结束自身。不要假设任何被取消的线程或任务会立即停止运行。如果您的代码需要这样做,则需要修复代码


至于重新启动-从头开始?使用相同的参数创建AsyncTask的新实例。从你停下来的地方开始?你可以用两种方法来做,但这需要很多工作。AsyncTask不适合这样做,因为它的线程是所有任务之间的共享资源,因此您需要使用实际的线程。

不可能像这样安全地从外部立即取消线程。您不知道它可能正在运行什么操作,线程可能持有什么锁,等等。因此,取消实际上不会立即停止线程。它设置一个标志,AsyncTask的任务是检查标志并通过从doInBackground返回来结束自身。不要假设任何被取消的线程或任务会立即停止运行。如果您的代码需要这样做,则需要修复代码


至于重新启动-从头开始?使用相同的参数创建AsyncTask的新实例。从你停下来的地方开始?你可以用两种方法来做,但这需要很多工作。AsyncTask不适用于此,因为它的线程是所有任务之间的共享资源,因此您需要使用实际的线程来完成此任务。

“有没有停止执行的想法?”--您正在停止执行。但是,您假设
cancel()
同步发生,并且
getStatus()
将立即返回不同的值<代码>getStatus()在
cancel()
返回时肯定还没有更新,基于。“有没有停止执行的想法?”--您正在停止执行。但是,您假设
cancel()
同步发生,并且
getStatus()
将立即返回不同的值
getStatus()
根据返回的时间
cancel()
肯定还没有更新。