结束后台线程上的活动

时间:2014-07-25 05:50:49

标签: java android multithreading android-activity thread-safety

我认为从一个不是UI线程的线程调用活动上的finish()是不好的做法。当需要发生某个事件(在渲染/循环线程中计算)时,我需要结束一个活动。

根据类似问题的答案,使用Handler发布请求以完成UI线程上的活动是合适的。我试图这样做,但活动从未结束 - 在发布之前我必须做些什么,或者我应该使用完全不同的方法?

1 个答案:

答案 0 :(得分:2)

默认情况下,处理程序是在它们实例化的(Looper)线程上创建的。要确保处理程序位于主UI线程上,您可以执行以下操作:

Handler myHandler = new Handler(Looper.getMainLooper());

然后,要将项目发布到主线程,请创建一个实现Runnable接口的类,然后发布到Handler。

myHandler.post(new Runnable() {
  @Override
  public void run() {
     // Code to run on UI thread.
  }
});

另一个方便的花花公子技巧是你可以发布到你的活动可见的View。例如你的根视图。

View myView = findViewById(R.id.myViewId);
Runnable runnableObject = new MyRunnableObject();
myView.post(runnableObject);

有关此事的一些注意事项。发布到Views的所有内容都将在UI线程上运行。发布到Views 的项目只有在View位于“查看树”之后才会执行。您可以将Runnables发布到View,然后它们全部触发,View对用户可见。还应该注意,取消已发布到Views的Runnable并不是特别容易。他们在内部使用Handler,但remove____()方法被抽象出来。

相关问题