0

ボタンがあり、それをクリックすると、他のアクティビティが読み込まれます。これを作成すると、スピナーにWebサービスからのデータを入力するメソッドが呼び出されます。

このボタンをクリックすると、画面が「フリーズ」したままになり、アクティビティが表示されます。そのため、ユーザーに進行状況ダイアログを表示し、Webサービスが返されたら、進行状況ダイアログを終了するのは良いことだと思いました。

Handlerを使用しようとしましたが、AsyncTaskを使用しようとしていますが、Webサービスが呼び出される前にプログラムがスピナーをいっぱいにしているため、NullPointerExceptionが発生します。

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 に答える