2014-07-25 23 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____()方法被抽象出來。