这是我的流程和问题:
在此应用程序中,单击“菜单”按钮
在此菜单中按下切换按钮,启动Async-Task(每隔30秒发出一次音调)。此任务是在选中切换时持续运行,并在取消选中时取消。只要您保留在菜单窗口中,此工作就可以启动和停止该过程。
检查切换框!
如果窗口被剥离并且Menu再次打开,则切换的保存状态为Checked,并且该过程仍在运行。但是,我认为我失去了对异步任务实例的访问权限。这可能是为什么取消选中切换会使程序崩溃的原因? myTask.cancle(真);可能就像一个丢失的参考,我的Asynch-Task现在正在虚空中流淌出来,我再也无法召唤或控制它了!
在这种情况下,我该怎么做才能获取异步任务并取消它?
TL,DR; 如果我从一个活动(mTask = new ...)生成异步任务,但是然后离开该活动,我怎样才能访问mTask?
答案 0 :(得分:0)
如果活动被销毁/停止,如果不需要,您应该立即停止同步任务,
@Override
public void onStop(){
mTask.cancel();
}
有关取消同步任务的详细信息,请参阅此处 Android - Cancel AsyncTask Forcefully
答案 1 :(得分:0)
我认为您不应该使用AsyncTask
API,该API用于在后台线程中运行耗时的任务,并提供挂钩以在UI完成或具有中间结果时更新UI。
您可以简单地使用Runnable
和单例模式来跨活动构造和销毁来定位实例。类似的东西(为简洁省略了单独的样板)
public class Player implements Runnable {
public static void start() {}
@Override
public void run() {
while (alive) {
playSound();
sleep();
}
}
public static void stop() {}
public static boolean isAlive() {}
}
然后,在初始化小部件时:
checkbox.setChecked(Player.isAlive());
checkbox.setOnCheckedStateChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
Player.start();
else
Player.stop();
}
});
这样你的后台线程完全独立于任何启动它的Activity。