2012-04-30 65 views
0

我有一個具有不同活動的android應用程序,它們都從Web源中提取數據。這是通過實現Runnable並創建一個活動作爲對象的線程來完成的。基本類是這樣的:從不同線程調用相同的對話框

public ActivityX extends Activity implements Runnable { 

    @Override 
    public onResume() { 
     super.onResume(); 
     Thread someThread = new Thread(this); 
     someThread.start(); 
    } 

    @Override 
    public run() { 
     try { 
      // pull web content 
     } 
     catch(TimeOutException e) { 
      // >>> create dialog here <<< 
      // go back to another activity 
     } 
    } 
} 

我試圖創建一個返回超時對話框的靜態方法的對話框輔助類,然後調用show()這樣的:

HelperClass.getTimeOutDialog().show(); 

但問題是,我不能從run()方法內部調用它,因爲它在不同的線程中。如果我嘗試,我會得到一個運行時異常聲明:

不能()內螺紋已不叫Looper.prepare

我需要將近一打這樣做對話框創建處理程序活動,我真的想要解決使用Handler對象並每次發送消息來調用對話框。有沒有更簡單的方法來做到這一點?不幸的是我現在無法想到任何權利。

我的代碼看起來是這樣的:

handler.handleEmptyMessage(1); 

這是調用處理程序。而下面的就處理了該消息:

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     if(msg.what == 1) { 
      // show dialog here 
     } 
    } 
}; 

乾杯

回答

1
@Override 
    public run() { 
     try { 
      // pull web content 
     } 
     catch(TimeOutException e) { 
      runOnUiThread(new Runnable(){ 
       @Override 
       public void run() { 
        // >>> create dialog here <<< 
        // go back to another activity 
       } 
      } 

     } 
    } 

嘗試上面的一個,如果你不希望使用處理器。

+0

這樣好多了。 runnable可以在HelperMethod中生成,然後該行看起來像_runOnUiThread(HelperClass.getTimeoutRunnable(this)); _ – Viciouss

0
private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     if(msg.what == 1) { 
      // show dialog here 
     } 
    } 
}; 

這段代碼的活動主題中的一部分,而不是?如果它是你的非Ui線程的一部分,它會給你錯誤信息。確保處理程序實例在UI線程創建的,因爲處理程序包含他們得到在創建線程的隱式引用。

+0

處理程序在活動類中創建,因此它可以處理消息。但我不想在每個拉動網頁內容的課程中添加所有這些代碼。我正在尋找更容易完成的事情。 – Viciouss