Android:使用进度对话框填充Spinner

时间:2012-06-07 18:31:51

标签: android nullpointerexception spinner progressdialog

我有一个按钮,当我点击它时,我加载了其他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();

 }

}

2 个答案:

答案 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),根据建议您可以创建适配器。