我有一个按钮,当我点击它时,我加载了其他Activity,onCreate of this我调用一个方法,用Web服务中的数据填充微调器。
好吧,当我点击此按钮时,屏幕保持“冻结”状态,然后显示活动。因此,我认为为用户显示进度对话框可能是一件好事,并且在获得Web Service的返回后,结束进度对话框。
我尝试使用Handler,现在我正在尝试使用AsyncTask,但是,正在尝试NullPointerException,因为我的程序在调用Web服务之前填充了微调器。
private void fillSpinner(){
//runWebService();
new CallWebServiceAsyncTask().execute(null);
mAdapter = new PlanesAdapter(this, allPlanes);
mList.setAdapter(mAdapter);
}
class CallWebServiceAsyncTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(PlanesActivity.this);
progressDialog.setMessage("Loading...");
progressDialog.show();
}
@Override
protected Void doInBackground(Void... v) {
runWebService();
return null;
}
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
}
}
答案 0 :(得分:1)
因为我的程序在调用Web服务之前填充了微调器。
您应该在onPostExecute Method
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
mAdapter = new PlanesAdapter(this, allPlanes);
mList.setAdapter(mAdapter);
}
答案 1 :(得分:0)
@SamirMangroliya建议的是正确的,但你甚至需要知道你哪里出错了。当您调用AsyncTask时,您要求应用程序在后台执行某些操作,这些操作将在非UI线程中进行。现在,当您在AsyncTask对象上调用execute()
时,函数doInBackground(Void... v)
中编写的应用程序代码将在后台运行,并且您的控件将在调用execute()
[new CallWebServiceAsyncTask().execute(null)]
后返回到下一个语句,在您的情况下是填充适配器值的操作。这些值尚未从Web服务接收。您可以确定完成后台操作的唯一地方是函数onPostExecute(Void result)
,根据建议您可以创建适配器。