我有一个与 AsyncTask
类相关的概念性问题。我们使用 AsyncTask
这样主 UI 就不会被阻塞。
但是假设,我想从设备的内存中检索一些数据,为此我使用 AsyncTask 类。相关代码行如下(假设返回的数据类型为String):
//code
String data = new ExtendedAsyncTask().execute(param1, param2).get();
//use this returned value.
上面的行不会阻塞 UI,破坏使用 AsyncTask
的目的吗?如果是,那么如何在不阻塞 UI 的情况下获取相关数据?我想补充一点,下一行代码将需要此数据来执行某些任务,因此取决于返回值。
谢谢
最佳答案
get() 方法将阻塞 UI 线程
。要获取相关数据,您需要从 doInBackground 返回值并捕获 onPostExecute 参数中的值。
Value returned by doInBackground is captured by onPostExecute method
例子:
public class BackgroundTask extends AsyncTask<String, Integer, String >{
private ProgressDialog mProgressDialog;
int progress;
public BackgroundTask() {
mProgressDialog = new ProgressDialog(context);
mProgressDialog.setMax(100);
mProgressDialog.setProgress(0);
}
@Override
protected void onPreExecute() {
mProgressDialog =ProgressDialog.show(context, "", "Loading...",true,false);
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
setProgress(values[0]);
}
@Override
protected String doInBackground(String... params) {
String data=getDatafromMemoryCard();
return data; // return data you want to use here
}
@Override
protected void onPostExecute(String result) { // result is data returned by doInBackground
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
mProgressDialog.dismiss();
super.onPostExecute(result);
}
}
If you are using asynctask in separate class, then use AsyncTask with callback interface like this
这是我之前提供的关于相同 AsyncTask with Callback 的答案
关于android - 从 AsyncTask 返回数据而不阻塞 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15635436/