2014-07-25 65 views
-2

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

根据对类似问题的回答,使用Handler发布请求以在UI线程上完成活动将是适当的。我试图做到这一点,但活动从未结束 - 发布前我必须做些什么,或者我应该使用完全不同的方法? 。在(循环)线程,他们在实例被创建

+1

显示您的代码。和LogCat,如果发生任何错误.. – SilentKiller

+0

我想知道downvote这个完全有效的问题的原因。有人请赐教。 –

回答

2

处理程序默认情况下,为了确保处理程序是主UI线程上,你可以这样做:

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

然后,发布项目到主线程,创建一个实现Runnable接口的类然后发布到处理程序。

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); 

有些事情要注意这一点。发布到视图的所有内容都将在UI线程上运行。发布到Views的项目将不会执行,直到View位于查看树上。您可以将Runnables发布到您的View,然后他们都会发射第二个View对用户可见。还应该注意的是,取消发布到视图的Runnable并不是特别容易。他们在内部使用Handler,但remove____()方法被抽象出来。