1

2 つの条件が満たされたときにコードを実行する必要があります。

  1. 件名のテキストは、バックグラウンド スレッドを使用してデータベースから正常にクエリされます。
  2. ビューのディメンションは、メイン スレッドを使用して正常に取得されます。件名のテキストと View のディメンションの両方が、Activity のメンバー変数として格納されます。

1) については、Activity の onCreate() で AsyncTask を開始し、doInBackground で DB にクエリを実行して Subject テキストを取得し、それを Activity のメンバー変数に格納します。

2) については、Runnable を UI スレッドに投稿し、run() でビューのディメンションをクエリして、Activity のメンバー変数に格納します。onCreate() でも行われます。

1 と 2 のどちらが先に終了するかは保証できません。

したがって、私の質問は、コードを実行する前に 1 と 2 の両方が終了するのを待つ推奨パターンは何ですか?

4

3 に答える 3

2

CountDownLatchを使用できると思います

このような問題を解決することを目的としています。

まず、コードのどこかにラッチを作成する必要があります。1) と 2) の前のどこかに

CountDownLatch latch = new CountDownLatch(2); // wait for 2 threads;

各アクションで、完了したらcountDownonlatchインスタンスを呼び出します

latch.countDown();

両方のスレッドが完了する必要がある時点で、インスタンスをawait呼び出しlatchます

latch.await(); // Will block. Will resume after both thread are completed
于 2012-05-09T08:58:12.333 に答える
0

onPostExecuteでAsyncを使用して最初のタスクを実行すると(最初のタスクが終了すると呼び出されます)、UIスレッドで実行可能に投稿するか、ビューのメジャーディメンションを直接取得して、必要なコードを実行できます。 。

于 2012-05-09T09:45:48.673 に答える
0

私が以前に行った方法は非常に簡単です。スレッドが終了したら、ブール値を設定しました。次に、各スレッドからメソッドを呼び出して、両方の値が true であることを確認します。このようなもの:

onPostExecute(){

    queryComplete = true;

    checkThreadCompleted();

}


onPostExecute(){

    viewMeasured = true;

    checkThreadCompleted();

}

private void checkThreadCompleted(){

     if(queryComplete && viewMeasured){
         //Do something
     }
}
于 2012-05-09T09:53:00.233 に答える