[英]Multiple UI Threads with one Working Thread
我有一個帶有以下圖表的應用程序:
開始屏幕->控制屏幕<->設置屏幕<->消息屏幕
始終必須運行的工作線程是一個HTTP請求,該請求不斷收集信息,因此可以在“開始”屏幕上啟動它。
開始屏幕跳到控制屏幕。
即使我更改為“設置”或“控制屏幕”,在工作線程中收集的信息也必須傳遞到“消息”屏幕並全部顯示。 這是通過同時運行2個UI線程以在后台更新消息屏幕來完成的嗎? (我首先介紹了什么是不斷顯示消息的應用程序)
通常只有1個UI線程。 如果您希望有更長的運行任務(尤其是不管UI如何,它們都可以繼續運行),則應該使用服務。 即使關閉應用程序,該服務也可以在后台運行。 這樣,您可以讓一個類負責所有網絡流量和數據收集,並且所有活動都可以綁定到該類。
首先,只有一個UI線程 ,它是運行應用程序的主線程,查看此答案將有助於您更好地了解android中的線程:
UIThread是應用程序執行的主要線程。 這是大多數應用程序代碼運行的地方。 您的所有應用程序組件(活動,服務,ContentProviders,BroadcastReceivers)都在此線程中創建,並且對這些組件的任何系統調用均在此線程中執行。
現在,您想要執行需要訪問UI線程的操作(例如,在屏幕上顯示某些內容,為視圖添加動畫效果,...等),因此,您不僅可以實現以下目的:
1-使用方法runOnUIThread()
:
此方法使用當前的Activity上下文或應用程序上下文來在UI線程(主線程)中運行包裝的代碼,只需要在運行的Activity中的任何地方使用其簽名即可:
runOnUiThread(new Runnable() {
@Override
public void run() {
mInfo.setText(str);
}
});
或者甚至可以通過將活動或應用程序上下文保存在任何地方來從當前活動之外運行它,因此即使從普通類中也可以運行它:
MainActivity.mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
mInfo.setText(str);
}
});
2-使用AsyncTask
:
AsyncTask是一種在后台線程中進行后台工作,然后將結果應用於主線程(UI線程)的android方法。
您所要做的就是使用AsyncTask
提供的doInBackground()
方法來處理必須在工作線程中完成的后台工作(例如在您的情況下處理HTTP請求),然后按順序使用postExecute()
方法將結果反映到UI線程:
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// handle your worker thread work here
return "result";
}
@Override
protected void onPostExecute(String result) {
// update your UI here
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.