[英]Java AsyncTask passing variable to main thread
在使用AsyncTask在另一個線程中完成網絡連接后,我一直試圖更改textView。 我嘗試了無數解決方案,但到目前為止都沒有奏效。
我能夠實現目標的唯一方法是使用.get(),但是它會停止UI線程一段時間,而這是我所不希望的。
我也嘗試過使用AsyncTask作為外部類,並在中間使用包裝器類。
所以我的問題是,在不凍結主線程的情況下,最簡單的方法是持有doInBackground()和onPostExecute()中使用的變量?
這是一種方法。 您可以在異步任務的參數中提供回調,執行所需的任何操作,它們就會從異步任務中獲取值。
回調界面:
public interface AsyncTaskCompleteListener<T> {
public void onTaskComplete(T result, int number);
}
AsyncTask:
public class LoadURL extends AsyncTask<String, Process, String> {
private AsyncTaskCompleteListener<String> callback;
public LoadURL(AsyncTaskCompleteListener<String> cb) {
this.callback = cb;
}
protected void onPreExecute() {}
protected String doInBackground(String... arg0) {
// do something
return content;
}
protected void onPostExecute(String content) {
if (callback != null)
callback.onTaskComplete(content,number);
}
}
活動內容:
public class LoginActivity extends Activity implements AsyncTaskCompleteListener<String> {
@Override
protected void onCreate(Bundle savedInstanceState) {
LoadURL loadUrl = new LoadURL(LoginActivity.this);
loadUrl.execute(...);
}
@Override
public void onTaskComplete(String result, int number) {...}
}
在onTaskComplete中,您可以輕松修改TextView
只需在AsyncTask中的以下代碼中更新UI:
@Override
protected void onPostExecute(Int result) {
textView.setText(result.toString());
}
如果您需要其他幫助,請查看此鏈接 。
您應該從doInBackground()返回變量。 框架將確保您將在onPostExecute()中獲得返回的值。
onPostExecute在UI線程上運行,因此您應該能夠在此處刷新任何UI元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.