15

URL から RSS フィードを取得し、SAX パーサーを使用して XML の各項目を配列に貼り付ける Android アクティビティがあります。これはすべて正常に機能しますが、予想どおり、少し時間がかかるため、AsyncActivity を使用してバックグラウンドで実行したいと考えています。私のコードは次のとおりです。

class AddTask extends AsyncTask<Void, Item, Void> {

    protected void onPreExecute() {
        pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true);
    }

    protected Void doInBackground(Void... unused) {
        items = parser.getItems();

        for (Item it : items) {
            publishProgress(it);
        }
        return(null);
    }

    protected void onProgressUpdate(Item... item) {
        adapter.add(item[0]);
    }

    protected void onPostExecute(Void unused) {
        pDialog.dismiss();
    }
  }

私が電話するonCreate()もの

new AddTask().execute();

行は正常にitems = parser.getItems()機能します - itemsXML からの各項目を含む配列リストです。私が直面している問題は、アクティビティの開始時、メソッドが終了するonPreExecute()まで作成した ProgressDialog が表示されないことです。つまり、黒い画面が表示され、長い一時停止の後、項目が完全に入力されたリストが表示されます。これはなぜですか? UI の描画、ProgressDialog の表示、パーサーが項目を取得して段階的にリストに追加し、ProgressDialog が閉じないのはなぜですか?doInBackground()

4

4 に答える 4

13

タスクを実行した後、何かが UI スレッドをブロックしていると思われます。たとえば、私は人々が次のようなことをしているのを見てきました。

MyTask myTask = new MyTask();
TaskParams params = new TaskParams();
myTask.execute(params);
myTask.get(5000, TimeUnit.MILLISECONDS);

ここでの get 呼び出しは、タスクが実際に完了するまで、タスクの onPreExecute() メソッドで UI 関連のものを防ぐ UI スレッド (おそらくここでタスクをスピンオフしています...) をブロックします。おっと!お役に立てれば。

于 2010-11-17T14:06:50.377 に答える
11

これは私のために働く

@Override
protected void onPreExecute() {
        dialog = new ProgressDialog(viewContacts.this);
        dialog.setMessage(getString(R.string.please_wait_while_loading));
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();
    }
于 2010-04-24T20:14:11.220 に答える
4

これは、AsyncTask.get()「必要に応じて計算が完了するまで待機し、その結果を取得する」という UI スレッドをブロックすることを使用したためです。

それを行う正しい方法は、コンストラクターによってActivityインスタンスを渡し、 .AsyncTaskAsyncTask.onPostExecution()

于 2013-11-17T22:47:19.637 に答える
1

実際のアクティビティで AsyncTask をサブクラス化すると、onPostExecuteメソッドを使用してバックグラウンド作業の結果を呼び出し元クラスのメンバーに割り当てることができます。

3 番目のジェネリック型として指定されている場合、結果はこのメソッドのパラメーターとして渡されます。

このように、UI スレッドは上記のようにブロックされません。ただし、バックグラウンド スレッドがまだ実行されている可能性があり、メンバーが新しい値を持っていない可能性があるため、サブクラス外での結果の後続の使用に注意する必要があります。

于 2011-06-17T18:17:35.917 に答える