我有一个活动,由AsyncTask组成,旨在在用户点击按钮时启动请求。我一直在寻找答案,但没有找到相同的问题,或者对我来说不一样。代码正在做我想要的事情,但ProgressDialog看起来被阻塞了,因为旋转器有时不会转动(几乎所有时间都是如此)。
当我点击按钮时:
AsyncTask被启动 - > onPreExecute中调用showDialog() - > startSearch(SearchManager启动新的AsyncTask,在doInBackground中有一个带有网络的重要调用) - > Activity中的doInBackground等待SearchManager被加载 - >显示。
我看起来似乎做错了什么,但是找不到错误在哪里以及如何避免这种情况。谢谢你的帮助! 解决方案: 最后,似乎原因是我在使用同一 ProgressDialog 实例导致进度对话框无法旋转。
当我点击按钮时:
AsyncTask被启动 - > onPreExecute中调用showDialog() - > startSearch(SearchManager启动新的AsyncTask,在doInBackground中有一个带有网络的重要调用) - > Activity中的doInBackground等待SearchManager被加载 - >显示。
button_search.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new SearchTask().execute();
}
});
在搜索活动中使用异步任务的代码:
private class SearchTask extends AsyncTask<Void,Void,Void>{
@Override
protected void onPreExecute(){
showDialog(DIALOG_LOADING_ID);
searchManager.startSearch();
}
@Override
protected Void doInBackground(Void... params) {
while(searchManager.isLoading()){
try {Thread.sleep(150);} catch(Exception e){};
}
return null;
}
@Override
protected void onPostExecute(Void ret){
try {dismissDialog(DIALOG_LOADING_ID);} catch (Exception e){};
if ( searchManager.errorOccurred() ){
//Error
} else {
//No Error
}
}
搜索管理器异步任务的代码:这是由startSearch直接启动的
protected class SearchAsync extends AsyncTask <Void,Void,Void>{
@Override
protected Void doInBackground(ComSearchAds... datas) {
global.getDataManager().doSearch();
//... When finished
setIs_loading(false);
}
}
我看起来似乎做错了什么,但是找不到错误在哪里以及如何避免这种情况。谢谢你的帮助! 解决方案: 最后,似乎原因是我在使用同一 ProgressDialog 实例导致进度对话框无法旋转。
showDialog(DIALOG_LOADING_ID);
//doInBackground
dismissDialog(DIALOG_LOADING_ID);
使用 causes 会导致问题,我改成了
removeDialog(DIALOG_LOADING_ID)
现在它正常运作。感谢大家,希望能有所帮助!
onPreExecute
中启动另一个AsyncTask?为什么不直接在SearchTask
的doInBackground()
中运行global.getDataManager().doSearch();
? - Vladimir