我认为从一个不是UI线程的线程调用活动上的finish()
是不好的做法。当需要发生某个事件(在渲染/循环线程中计算)时,我需要结束一个活动。
根据类似问题的答案,使用Handler发布请求以完成UI线程上的活动是合适的。我试图这样做,但活动从未结束 - 在发布之前我必须做些什么,或者我应该使用完全不同的方法?
答案 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____()
方法被抽象出来。