2013-02-28 19 views
1

因此,首先我想出瞭如何從另一個線程更新UI。我使用的AsyncTask和處理程序類爲別的實現用於更新用戶界面的監聽器界面的主要活動

在我做錯了首位,現在我真的想找出什麼是錯的。

所以我第一次嘗試創建一個java接口MyListener與方法updateUI()並讓主要活動實現該偵聽器接口。比我在處理http請求的線程中將主要活動註冊爲偵聽器。在該請求完成後,我從該線索呼叫MyListener.updateUI()updateUI()用請求的結果更新一些文字查看。

這在android中不起作用。我沒有想到這一點。我不知道爲什麼。 異常告訴我,我必須從UI線程進行這些更新。

我不明白爲什麼updateUI()不會在UI線程運行時,我叫MyListener.updateUI()與實施從監聽器接口updateUI()的主要活動。

你能解釋我這種行爲嗎?

+0

發佈您的代碼和其他人可以幫助 – Bolton 2013-02-28 16:03:33

回答

1

你得到這個錯誤是因爲控件仍然在後臺線程中......儘管你已經調用了在你的活動中實現的接口方法。因此爲了讓控制回到你的UI線程,你需要通過調用位於您的活動中的方法,控件不會從後臺線程進入UI線程。

希望這可以澄清你的疑問。

+0

因此,當後臺線程正在調用由主線程中運行的類實現的方法時,該方法仍然在後臺線程中運行?(哦,男士,我是多年的開發人員,但我似乎沒有完全理解線程控制是如何工作的。) – mherwig 2013-02-28 17:17:40

2

如果您在MainActivityonCreate()方法或其他任何其他線程中調用MyListener.updateUI()無關緊要,因爲您只能在應用程序主線程中更新View。要做到這一點,你可以做這樣的事情:

public static void updateUI(){ 

     ((Activity) mContext).runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      // update your UI here and be sure to give the activity context, not getApplicationContext(); 
     } 
    }); 

} 

把這個在您的活動,並在您onCreate()做這樣的事情:

public static Context mContext; 
@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mContext = this; 
} 

,並呼籲從你想要做什麼的線程updateUI()

當然,這不是您更新界面的唯一方法。您可以看看Android SDK中的AsyncTask實現。這是一個非常強大的課堂,我認爲它會做更有效的事情。

3

我看到你已經在其他線程中執行了http請求,但是你不使用AsyncTask,對不對?我建議你應該使用該類,執行doInBackground方法中的http請求(因爲它在主線程中運行),並且在onPostExcute上調用MyListener.updateUI(),因爲此方法總是在主線程中調用。試試看,讓我知道它是否有效。