我在使用AsyncTask的另一个线程中完成网络连接后,一直在尝试更改textView。我已经尝试了无数的解决方案,但迄今为止都没有。
我能够实现目标的唯一方法是使用.get(),但它会停止UI线程一段时间,这是我不想要的。
我也尝试使用AsyncTask作为外部类,并在中间使用包装类。
所以我的问题是,在不冻结主线程的情况下,获取doInBackground()和onPostExecute()中使用的变量的最简单方法是什么?
答案 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) {...}
}
答案 1 :(得分:1)
只需更新AsyncTask中的以下代码中的UI:
@Override
protected void onPostExecute(Int result) {
textView.setText(result.toString());
}
如果您需要额外帮助,请查看此link。
答案 2 :(得分:1)
您应该从doInBackground()返回变量。框架将确保您将在onPostExecute()中获得返回值。
onPostExecute在UI线程上运行,因此您应该能够刷新任何UI元素。