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
在另一个线程中使用 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