0

私はAsyncTask決して死ぬことのないものを持っています。このイベントのリスナーAsyncTaskは変化し続けます(ユーザーに表示されるアクティビティ/フラグメントによって異なります)。これを達成するために、私は次のような設定をしています:

  • インターフェース:
public interface TaskListener {
   public void onItemChanged(String itemName)
}
  • TaskListenerパブリックメソッドを使用して登録/登録解除されるメンバー変数を含むAsyncTask 。
public void registerListener(TaskListener listener) {
    mListener = listener;
}

public void unregisterListener() {
    mListener = null;
}
  • onPublishProgress()メソッド(メソッドでviaと呼ばれるpublishProgress()doInBackground()AsyncTask、リスナーに通知します。

さて、私の質問は、リスナーに通知している間、この状況に対する警告はありますか?特に、スレッドセーフかどうか知りたいです。つまり、publishProgress()registerListener()が同時に呼び出された場合、適切なリスナーはコールバックを受け取りますか?

4

2 に答える 2

1

私はかつてAsyncTaskをデバッグする必要があり、自分のコードに従ってAndroidのソースコードにさえ入りました。

publishProgress()は直接呼び出しを発行せずonProgressUpdate()、キューにメッセージを投稿するだけで、キューハンドラーは最終的にを呼び出しますonProgressUpdate()
厳密に言えば、publishProgress()registerListener()が同時に呼び出された場合、registerListener()最初にそこに到達します。

2つの間の干渉が心配な場合は、機密コードを同期ブロックで囲み、そこにある変数をすべて覆います。

synchronized(mListener) {
    // do stuff to mListener
}

これは、リスナーの処理で相互に排他的になりたい他の場所の両方onProgressUpdate()で行います。registerListener()

于 2012-06-07T14:35:04.703 に答える
1

AsyncTask活動の合間に生きるべきではありません。それは本当に正しい方法ではありません。Androidはservicesこれに対応しています。

http://developer.android.com/reference/android/app/Service.html

http://developer.android.com/guide/developing/tools/aidl.html

于 2012-06-07T14:37:45.110 に答える