2013-10-27 29 views
-1

我試圖使用setContentView方法將我的視圖帶到前面,但是在執行此操作時出現此錯誤。只有創建視圖層次結構的原始線程可以觸及其視圖 - 致命例外

從這裏搜索類似問題我發現這個錯誤通常會導致試圖獲取/設置佈局視圖對象的值。沒有實例化,但這不是這種情況,我甚至無法設置視圖。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.ticker); 
    Thread tmr = new Thread() { 
     public void run() { 
      try { 
       sleep(1000); 
      } catch (InterruptedException iEx) { 
       iEx.printStackTrace(); 
      } finally { 
       User usrObj = new User(); 
       if (usrObj.authenticateUser()) { 

        Intent mainActivity = new Intent(
          "android.intent.action.Homeview"); 
        startActivity(mainActivity); 
       } else { 
        setContentView(R.layout.login); // <- ERROR 
        activateLogin(); 
       } 
      } 
     } 

    }; 
    tmr.start(); 

} 
+0

UI相關操作只能由UI線程處理。你正在一個新的線程中設置一個視圖。使用線程中的消息處理程序將信息傳遞給UI線程或使用AsynTask! –

回答

1

您需要致電runOnUiThread從線程更改佈局。

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     User usrObj = new User(); 
     if (usrObj.authenticateUser()) { 
      Intent mainActivity = new Intent("android.intent.action.Homeview"); 
      startActivity(mainActivity); 
     } else { 
      setContentView(R.layout.login); // <- ERROR 
      activateLogin(); 
     } 
    } 
}); 

作爲一個側面說明,要確保你不硬編碼字符串,以避免錯字issues.-

Intent mainActivity = new Intent(YourActivity.this, android.intent.action.Homeview.class); 
+0

你是對的,但是使用單獨線程的目的是爲了減輕主線程上的壓力(和瓶頸)。所以'runOnUiThread'塊應該只包含必須在主線程上執行的調用。 – NitroNbg

+0

@NitroNbg你是對的。無論如何,這種情況看起來不像性能問題,線程只是用來延遲下一個活動的啓動(很可能這是啓動屏幕的代碼)。 – ssantos

1

你調用從非UI的setContentView(...)線。將其移動到主(UI)線程或將該單個呼叫包入:

runOnUIThread(new Runnable() { 
    @Override 
    public void run() { 
     setContentView(R.layout.login); 
    } 
}); 
相關問題