8

このコールバックがアプリで行われると、やらなければならない作業がかなりあります (ORM ライブラリと距離ベースの計算を介した SQL データベースへの読み取りと書き込み)。当然のことながら、メインの UI スレッドをブロックしないことを懸念しているため、これがコールバックが行われるスレッドであるかどうかを (失敗して) 調べようとしました。そうである場合、コールバックが行われたときにトリガーされる AsyncTask で前述のすべての作業を行うつもりです。この同じ AsyncTask は、2 つの別々のアクティビティ クラスからもイベントを受け取ります。(ユーザー入力等への対応)

このコールバックに関して私が見つけた多くの議論は、コールバックが実際に受信されるスレッドを変更しようとする人々に基づいているようです。これは私には意味がありません。確かに、プラットフォームはこのコールバックのコンテキストを決定し、それを受け取ったときに行うべき賢明なことは、AsyncTask が適切と思われる別のスレッドに重大な作業をオフロードすることです。

誰かがここで使用した成功したパターンの概要を説明できれば、それは本当に役に立ちます。

4

1 に答える 1

7

のAndroidリファレンスドキュメントによるとLocationManager

呼び出し元のスレッドは、呼び出し元のアクティビティのメイン スレッドなどのルーパー スレッドである必要があります。

これは、コールバックを初期化するスレッドがメイン スレッドまたはスレッドである必要があることを意味しますLooper

これを処理する最善の方法はOnLocationChanged、メイン スレッドにレシーバーを登録することです。次に、コールバックで Runnable を作成してバックグラウンド スレッドに送信し、そこで実行時間の長いタスク (データベースへの書き込みなど) を実行します。

ExecutorService mThreadPool = Executors.newSingleThreadExecutor();

@Override
public void onLocationChanged(Location location) {
    mThreadPool.execute(new Runnable() {
        @Override
        public void run() {
            // Perform your long-running tasks here.
            //...
        }
    });
}
于 2012-06-21T00:29:08.177 に答える