0

我有一个按钮,当我单击它时,我加载了其他 Activity,我调用了一个方法,该方法用来自 Web 服务的数据填充微调器。

好吧,当我单击此按钮时,屏幕保持“冻结”状态,然后显示活动。因此,我认为向用户显示进度对话框可能是一件好事,并在获得 Web 服务的返回后,结束进度对话框。

我尝试使用 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();

 }

}
4

2 回答 2

1

因为我的程序在调用 Web 服务之前填充微调器。

您应该在获取数据后填写数据onPostExecute Method

 @Override

    protected void onPostExecute(Void result) {

    progressDialog.dismiss();

    mAdapter = new PlanesAdapter(this, allPlanes);
    mList.setAdapter(mAdapter);

 }
于 2012-06-07T18:34:37.220 回答
0

@SamirMangroliya 的建议是正确的,但您甚至需要知道哪里出错了。当您调用 AsyncTask 时,您要求应用程序在后台执行一些操作,这些操作将在非 UI 线程中发生。现在,当您调用execute()AsyncTask 对象时,在函数中编写的应用程序代码doInBackground(Void... v)在后台运行,并且您的控件返回到调用后的下一条语句execute() [new CallWebServiceAsyncTask().execute(null)],在您的情况下是填充适配器值的操作。这些值尚未从 Web 服务接收。您可以确定您的后台操作已完成的唯一地方是onPostExecute(Void result)按照建议您可以创建适配器的功能。

于 2012-06-07T18:46:30.510 回答