Java AsyncTask将变量传递给主线程

时间:2015-03-04 12:45:41

标签: java android multithreading networking android-asynctask

我在使用AsyncTask的另一个线程中完成网络连接后,一直在尝试更改textView。我已经尝试了无数的解决方案,但迄今为止都没有。

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

我也尝试使用AsyncTask作为外部类,并在中间使用包装类。

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

3 个答案:

答案 0 :(得分:3)

这是一种方法。您可以在异步任务的参数中进行回调,执行任何操作,并从异步任务中获取值。

回调界面:

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

答案 1 :(得分:1)

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

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

如果您需要额外帮助,请查看此link

答案 2 :(得分:1)

您应该从doInBackground()返回变量。框架将确保您将在onPostExecute()中获得返回值。

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