在我的Android应用程序中,我编写了一个异步任务,从谷歌应用程序引擎数据库中获取地理位置数据。一切正常,除了进程对话框无论我做什么都不显示。我已经按照所有可用的教程等但无济于事。
以下是我的工作:
我有一项显示地图数据的活动。
public class MapActivity extends FragmentActivity....
//On click of a button OR when user location changes, following method is called:
private void findAction(Location location){
//this.progressDialog = new ProgressDialog(this);
FetchHospitalsAsyncTask asyncTask = new FetchHospitalsAsyncTask(this);
List<Hospital> nearByHospitals = null;
try {
nearByHospitals = asyncTask.execute(1000.0, latitude, longitude).get();
}catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
...这是我的异步类
public class FetchHospitalsAsyncTask extends AsyncTask<Double, Void, List<Hospital>> {
private static String TAG = FetchHospitalsAsyncTask.class.getName();
private static HospitalApi hospitalApiService = null;
ProgressDialog progressDialog = null;
private Activity parentActivity = null;
public FetchHospitalsAsyncTask(Activity parentActivity){
this.parentActivity = parentActivity;
this.progressDialog = new ProgressDialog(parentActivity);
}
@Override
protected void onPreExecute(){
progressDialog.setMessage("Please wait.Fetching data from server....");
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.show();
}
@Override
protected void onPostExecute(List<Hospital> result){
if(progressDialog.isShowing()){
progressDialog.dismiss();
}
}
@Override
protected List<Hospital> doInBackground(Double... params) {
/*
*/
/*context = params[0].first;
String name = params[0].second;
String address= params[1].second;*/
double radius = params[0];
double lat = params[1];
double lon = params[2];
try {
com.cypherlabs.mumbaihospitalfinder.backend.hospitalApi.HospitalApi.GetNearByHospitals nearByHospitals=hospitalApiService.getNearByHospitals(radius,lat,lon);
nearByHospitals.getLastStatusCode();
return nearByHospitals.execute().getItems();
} catch (IOException e) {
//return e.getMessage();
return null;
}
}
}
进程对话框没有显示其存在的任何痕迹,而所有其他工作正常。使用所有标记等渲染地图。
答案 0 :(得分:0)
您正在AsyncTask上调用.get()
。这将导致AsyncTask同步而不是异步运行。这会导致UI线程被阻止,因此进度对话框将不会显示。
您需要在AsyncTask上调用execute()
。这将导致AsyncTask在单独的线程中运行而不会阻止UI。请注意,onPreExecute
和onPostExecute
方法将在您从
execute
的同一个线程上运行
答案 1 :(得分:0)
使用get()意味着它会冻结你的主ui线程,直到Async任务完成。添加进度对话框将在主Ui线程上运行。当你使用get()时,它不允许对主ui进行任何更改。因此,删除get(),您将获得进度对话框。