Java AsyncTask 将变量传递给主线程

Java AsyncTask passing variable to main thread

在另一个线程中使用 AsyncTask 完成联网后,我一直在尝试更改 textView。我尝试了无数的解决方案,但 none 到目前为止都有效。

我能够实现目标的唯一方法是使用 .get(),但它会暂时停止 UI 线程,这是我不想要的。

我也尝试过将 AsyncTask 用作外部 class,并在中间使用包装器 class。

所以我的问题是,在不冻结主线程的情况下获取 doInBackground() 和 onPostExecute() 中使用的变量的最简单方法是什么?

只需在 AsyncTask 中更新以下代码中的 UI:

@Override
protected void onPostExecute(Int result) {
  textView.setText(result.toString());
}

如果您需要额外帮助,请勾选此 link

您应该 return 来自 doInBackground() 的变量。框架将确保您将在 onPostExecute() 中获得 returned 值。

onPostExecute 在 UI 线程上运行,因此您应该能够在此处刷新任何 UI 元素。

这是一种方法。您可以在异步任务的参数中提供回调,做任何您想做的事情,他们会从异步任务中取回值。

回调接口:

public interface AsyncTaskCompleteListener<T> {
    public void onTaskComplete(T result, int number);
}

异步任务:

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);
    }
}

Activity :

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