我有一个帖子,我想让用户在点击进度通知时终止该线程。
我的通知工作正常,但在我的BroadcastReciever中,我无法杀死该帖子。
我无法使用thread.interupt()
,因为我无法访问线程对象。这也意味着我不能使用公共布尔来终止线程。
我还尝试将进程ID作为额外的进行传递,然后使用Process.killProcess(pid)
将其终止,但这会导致杀死我的UI线程和我可能运行的任何其他线程的相当不幸的副作用。
最后,我尝试使用线程ID,但是文档没有提到使用它来杀死线程。
简而言之,如何使用可作为附加内容传递的原始数据类型来终止我的线程?
答案 0 :(得分:1)
正确的方法是从内部阻止它。这意味着您在控制器内部定义(例如,boolean
),用于检查应用程序中的某些其他事件,以确定您的Thread
是否仍必须执行。这意味着您必须将代码置于一个内置Thead.sleep()
对象的循环中,以免线程过度使用,或者在Handler
内部使用postDelay()
操作,但这是方式。
如果您不想使用它,您也可以在里面声明BroadcastReceiver
。你注册你的接收器,并等待你定义的一些动作(我建议你自己动作,这样你就不会干扰Android),一旦你的接收事件发生,你只需在return
中使用Thread
即可退出。
答案 1 :(得分:1)
你用错误的方法看着它。
如果您正在运行一个线程并在通知栏上发出通知,我将假设您正在运行一个服务,并且此服务知道该线程并且确实有一个引用它。这样,PendinIntent用于通知,不应该简单地触发BroadcastReceiver,而是使用Intent额外触发相同的Service,指示服务应该取消该线程。
所以假设你的服务:
public MyService extend Service{
private Runnable myThread = new Runnable{
@Override
public void run(){
// ... here you're doing the job on the different thread
}
};
}
类似的东西:
Intent i = new Intent(this, MyService.class);
i.putExtra("cancel", true);
PendingIntent pi = PendingIntent.getService(// put here the intent)
然后,每当点击通知时,具有该线程的服务将从onStartCommand
执行,您需要做的就是:
cancel = getIntent.getBooleanExtra("cancel", false);
然后在线程中你必须从服务中检查boolean cancel
,如下所示:
public MyService extend Service{
boolean cancel = false;
private Runnable myThread = new Runnable{
@Override
public void run(){
// ... here you're doing the job on the different thread
if(cancel)
return;
}
};
}