我有一个活动,由AsyncTask组成,旨在当用户点击按钮时启动请求。我一直在寻找答案,但我没有找到同样的问题,或者对我来说不一样。代码正在做我想要的,但ProgressDialog看起来被阻止,因为微调器有时不转(几乎所有时间)。
当我点击按钮时:
启动AsyncTask - > showDialog()被调用onPreExecute - > startSearch(SearchManager在doInBackground中启动一个新的AsyncTask,与网络进行大量调用) - > Activity中的doInBackground等待加载SearchManager - >显示。
按钮代码:
button_search.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new SearchTask().execute();
}
});
搜索活动中的AsyncTask代码:
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
}
}
SearchManagerAsyncTask代码:由startSearch直接启动
protected class SearchAsync extends AsyncTask <Void,Void,Void>{
@Override
protected Void doInBackground(ComSearchAds... datas) {
global.getDataManager().doSearch();
//... When finished
setIs_loading(false);
}
}
我显然做错了什么,但找不到什么以及如何避免这种情况。谢谢你的帮助!
解决方案:
最后,似乎没有旋转的ProgressDialog是因为我使用了相同的ProgressDialog实例并且
showDialog(DIALOG_LOADING_ID);
//doInBackground
dismissDialog(DIALOG_LOADING_ID);
用于原因问题,我改为
removeDialog(DIALOG_LOADING_ID)
现在它工作正常。
谢谢大家,希望有一天能帮助别人!
答案 0 :(得分:0)
您是否可以尝试在布局文件中添加ProgressBar控件,并在启动异步任务时将其Visible设置为true,并在进程结束时设置为off。以下是相同的代码。
<ProgressBar
android:layout_width="wrap_content"
android:id="@+id/progressBar1"
android:layout_height="wrap_content"></ProgressBar>
答案 1 :(得分:0)
很难说,但是试试onClickListener:
button_search.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new SearchTask().execute();
setIs_loading(true);
searchManager.startSearch();
}
});
这是一个非常疯狂的猜测,但它可能会起作用
答案 2 :(得分:0)
您无需创建其他任务,只需通过其他活动进行搜索。
您需要做的就是为搜索任务搜索cod ein doInbackGround()。例如
@Override
protected Void doInBackground(Void... params) {
global.getDataManager().doSearch();
return null;
}
还使用类级变量来获取搜索结果以存储true / false
@Override
protected void onPostExecute(Void ret){
// Set you result here
setIs_loading(my_searh_result);
try {dismissDialog(DIALOG_LOADING_ID);} catch (Exception e){};
if ( searchManager.errorOccurred() ){
//Error
} else {
//No Error
}
}