在Android平臺下,進行多線程編程時,常常須要在主線程以外的一個單獨的線程中進行某些處理,而後更新用戶界面顯示。可是,在主線線程以外的線程中直接更新頁面顯示的問題是java
報異常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.android
【只有原始建立這個視圖層次(view hierachy)的線程才能修改它的視圖(view)】編程
也就是說必須在通常必須在程序的主線程(也就是ui)線程中進行更新界面顯示的工做。能夠採用下面的方法之一來解決:多線程
法1:ide
在Activity.onCreate(Bundle savedInstanceState)中建立一個Handler類的實例, 在這個Handler實例的handleMessage回調函數中調用更新界面顯示的函數。函數
/** * 啓動線程用來刷新登陸提示文字,N秒刷新一次 * */ private class FreshWordsThread extends Thread { @Override public void run() { try { mLoadingWords = "test"; mLoadhandler.sendEmptyMessage(REFRESH); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } } } //主線程中的handler class LoadHandler extends Handler { /** * 接受子線程傳遞的消息機制 */ @Override public void handleMessage(Message msg) { super.handleMessage(msg); int what = msg.what; Log.i(TAG, "Main handler message code: " + what); switch (what) { case REFRESH: { // 刷新頁面的文字 mLoadingText.setText(mLoadingWords); break; } } } }
法2:利用Activity.runOnUiThread(Runnable)把更新ui的代碼建立在Runnable中,而後在須要更新ui時,把這個Runnable對象傳給Activity.runOnUiThread(Runnable)。 這樣Runnable對像就能在ui程序中被調用。ui
FusionField.currentActivity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(FusionField.currentActivity, "Success", Toast.LENGTH_LONG).show(); } });