【问题标题】:Trying to stop AsyncTask in another Service's AsyncTask from Main Activity试图从主活动中停止另一个服务的 AsyncTask 中的 AsyncTask
【发布时间】:2012-11-07 17:12:23
【问题描述】:

我有一个 Activity,它实现了一个按钮单击以尝试停止我的 AsyncTask,它是服务的内部类并在我的服务内部执行。

主要活动

            if (s.equals("Stop scanning")) {
                fullscan.cancel(true);
                stopService(new Intent(AnalyzeActivity.this, ScanService.class));
                txtView.setText("Scanning is stopping...");
                txtView.setText("Scanning stopped");
                but.setText("Start scanning");
            }

Service 的 AsyncTask (fullscan) doInBackground

if (int i = 0; i < myList.size(); i++ )
        if (isCancelled()) {
            return null;
        }
}
return null;

但即使在调用fullscan.cancel(true) 之后,它似乎也没有被调用。

【问题讨论】:

  • 我知道这不是您问题的答案(这就是我评论而不是回答的原因),但是您为什么在服务中使用 AsyncTask 呢? AsyncTask 旨在将结果部署回 UI,服务没有 UI。
  • 因为我需要在后台运行一个长时间运行的进程,我的 AsyncTask 通过我的 Activity 内的接收器广播 UI 结果,它有一个内部广播接收器,当 Activity 处于活动状态时注册我的接收器。跨度>
  • 我只是说,虽然它可以工作,但异步任务并不是为此而设计的,也没有理由在服务中使用。检查线程和执行程序。另一方面,您在代码中添加的代码量不足以让别人帮助您。请多显示一些
  • 不太明白我可以显示哪些其他代码来更好地解释我的问题。
  • 那你怎么知道扫描没有取消呢?你是否在循环中检查isCancelled()

标签: android service android-asynctask


【解决方案1】:

您的活动如何连接到服务?您的活动应该只与绑定到它的底层服务通信(参考:Bound Services)而不是ServiceAsyncTask

在您的实例中,您的本地 IBinder 实现应该公开一个 cancelTask() 方法或类似的东西。当活动需要停止服务下正在完成的工作时,活动代码应该获取对服务的引用(这将在活动连接到服务时发生,参考:onServiceConnected)然后调用服务@987654326 @。

Service 将停止它自己的 AsyncTask,它引用了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多