杀死线程而无需访问线程对象

时间:2014-03-02 18:42:32

标签: android multithreading

我有一个帖子,我想让用户在点击进度通知时终止该线程。

我的通知工作正常,但在我的BroadcastReciever中,我无法杀死该帖子。

我无法使用thread.interupt(),因为我无法访问线程对象。这也意味着我不能使用公共布尔来终止线程。

我还尝试将进程ID作为额外的进行传递,然后使用Process.killProcess(pid)将其终止,但这会导致杀死我的UI线程和我可能运行的任何其他线程的相当不幸的副作用。

最后,我尝试使用线程ID,但是文档没有提到使用它来杀死线程。

简而言之,如何使用可作为附加内容传递的原始数据类型来终止我的线程?

2 个答案:

答案 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;
     }
   };
}