簡體   English   中英

Java AsyncTask將變量傳遞到主線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM