Java Android:在不阻塞UI线程的情况下从AsyncTask获取返回值
在Java Android:在不阻塞UI线程的情况下从AsyncTask获取返回值,java,android,android-asynctask,Java,Android,Android Asynctask,在活动的onCreate中,我执行以下操作: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AsyncTask<String, Integer, String[]> asynctask = new DownloadFilesTask(this.getActivity()).execute(url);
活动的onCreate
中,我执行以下操作:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AsyncTask<String, Integer, String[]> asynctask = new DownloadFilesTask(this.getActivity()).execute(url);
String[] values = null;
try {
values = asynctask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
Log.d("AsyncTask", "DONE!");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
AsyncTask AsyncTask=new DownloadFilesTask(this.getActivity()).execute(url);
字符串[]值=null;
试一试{
values=asynctask.get();
}捕获(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
Log.d(“异步任务”,“完成!”);
ArrayAdapter=新的ArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1,值);
setListAdapter(适配器);
}
这是可行的,但是我用asynctask.get()阻塞了UI线程代码>,它阻止我在执行后台任务期间显示任何新的UI元素,如对话框
因此,我的问题是:在给定此代码的情况下,如何在不阻塞UI线程的情况下从AsyncTask中获取结果值?
设计为从内部调用。基本上,后者是在完成或抛出异常之后在UI线程上执行的
例如:
class DownloadFilesTask extends AsyncTask<Params, Progress, Result>
{
@Override
public Result doInBackground(Params... params)
{
// ...
}
@Override
public void onPostExecute(Result result)
{
try
{
Result result = get();
// we are fine here, do something with the result
}
catch(CancellationException e){/* if cancel() is called on this instance */}
catch(ExecutionException e){/* if doInBackground() throws some exception */}
catch(InterruptedException e){/* If the current thread was interrupted while waiting */}
}
}
设计为从内部调用。基本上,后者是在完成或抛出异常之后在UI线程上执行的
例如:
class DownloadFilesTask extends AsyncTask<Params, Progress, Result>
{
@Override
public Result doInBackground(Params... params)
{
// ...
}
@Override
public void onPostExecute(Result result)
{
try
{
Result result = get();
// we are fine here, do something with the result
}
catch(CancellationException e){/* if cancel() is called on this instance */}
catch(ExecutionException e){/* if doInBackground() throws some exception */}
catch(InterruptedException e){/* If the current thread was interrupted while waiting */}
}
}
将其移动到onPostExecute
:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
ArrayAdapter=新的ArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1,值);
setListAdapter(适配器);
将此移动到onPostExecute
:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
ArrayAdapter=新的ArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1,值);
setListAdapter(适配器);
1-您是否也可以发布下载文件任务
2-当asyncTask执行时,它不会被加载,或者不管你在做什么,都不会立即发生,对吗?所以,在调用asynctask之后,您可能无法从中获得结果。。。因此,我建议您使用asyncTask的onPostExecute方法-您是否也可以发布下载文件任务
2-当asyncTask执行时,它不会被加载,或者不管你在做什么,都不会立即发生,对吗?所以,在调用asynctask之后,您可能无法从中获得结果。。。所以我建议您使用asyncTask的onPostExecute方法实际上不是,因为在onPostExecute中您有一个(令人惊讶的!)结果变量。。。get()用于强制非异步行为…@Selvin你是什么意思?你能详细解释一下吗?@Selvin你是对的,我一定是被弄糊涂了。实际上不是,因为在onPostExecute中,你有一个(令人惊讶的!)结果变量。。。get()用于强制非异步行为…@Selvin你是什么意思?你能详细解释一下吗?@Selvin你说得对,我一定被你弄糊涂了。你的回答最直截了当。现在可以用了,谢谢!在使用AsyncTasks时,请确保考虑到在调用postExecute时,用户已导航离开,而您的UI已死亡的情况。您得到了最直接的答案。现在可以用了,谢谢!在使用AsyncTasks时,请确保考虑到在调用postExecute时,用户已导航离开而UI已死亡的情况。