1

私はSOに関するほとんどの質問と回答を読みましたが、私の場合、どちらに進むべきかまだわからないと言わざるを得ません。いくつかの方法がありますが、どちらが私の場合に最も適しているかを実際に判断することはできません。

私が持っているもの

アプリから開始するサービスがあります。ユーザーの現在の場所を確認し、読み取り場所を使用してWebサービスを呼び出します。これはxメートルごとに発生します。

入手したいもの

  • 地図を使ってアクティビティを行い、サービスからの現在地の読み取り値を表示します。これは、私のアクティビティが読み取られた場所ごとに通知される必要があることを意味します。これはユーザーがアクティビティを開始したときにのみ使用されるため、サービスから各場所をブロードキャストすることは良い考えではないと思います。
  • サービスに最後に読み取った場所を尋ねることができるアクティビティ。
  • 前に述べたように、サービスは場所を読み取り、数秒ごとにWebサーバーに送信する必要があります。このための最良のアプローチは何でしょうか?インサービスでは、Webサービス呼び出しごとに新しいThread()を作成しますか?AsyncTaskを使用しますか?Webサービスからアクティビティを開始する必要がある場合など、応答としていくつかの追加の値を受け取ることがあります。

そうは言っても、私に何を使うことをお勧めしますか?これは良いアプローチでしょうか:例:メッセージングを使用したアクティビティとサービス間の通信

LE:Webサービスにデータを送信するために、IntentServiceから単純なサービス+スレッドに切り替えました。私のIntentServiceの実装が開始され、すぐに破棄されました。おそらく私は何か間違ったことをしました...

4

2 に答える 2

3

これは、読み取った場所ごとにアクティビティに通知する必要があることを意味します。

あなたの目標に対するクリーンで効率的な解決策は、ResultReceiverを使用することだと思います。

注:(以下に、私のアプリケーションの例を示します)。

例:

Serviceを呼び出すアクティビティ。

Intent i = new Intent(this, DownloadService.class);
i.putExtra("url", "http://dl.dropbox.com/u/67617541/2011-11-11_102220_nature.jpg");
i.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(i);

実装されたResultReceiver

private class DownloadReceiver extends ResultReceiver {

        public DownloadReceiver(Handler handler) {
            super(handler);
        }

        @Override
        public void onReceiveResult(int resultCode, Bundle resultData) {
           super.onReceiveResult(resultCode, resultData);
           if (resultCode == DownloadService.PROGRESS_UPDATE) {
              int progress = resultData.getInt("progress");
              pd.setProgress(progress);
           }
       }
}

そしてIntentServiceのフラグメント

protected void onHandleIntent(Intent intent) {  
   String urlLink = intent.getStringExtra("url");
   ResultReceiver receiver = intent.getParcelableExtra("receiver");
   // some body
   Bundle data = new Bundle();
   //publishing progress
   receiver.send(PROGRESS_UPDATE, data);
}

したがって、send(必要なときに) メソッドを呼び出すだけで、必要なことを実行できる場所でメソッドが呼び出さonReceiveResultれますResultReceiver

于 2012-06-21T12:22:29.480 に答える
0

これを使用する別のアプローチは、この応答に従ってハンドラーを使用することです。

リストされている記事では、サービスからそれを開始した UI 以外の UI にデータを渡す方法について説明しています...これはあなたの質問/問題ではありませんが、同じパターンを使用できます。

基本的に、Activity は、開始時に自身をハンドラー コールバックとして登録し、位置情報サービスを開始します。位置情報サービスはハンドラー コールバックにメッセージを投稿し、アクティビティによって処理されます。

アクティビティが終了したら、サービスを停止し、ハンドラー コールバックとして自分自身を削除します。

サービスが常に実行されているが、UI があるかどうかがわからない場合は、このパターンも使用できます。プロキシ ハンドラーは実際のコールバックがあるかどうかをチェックし、ない場合はメッセージが単に落とした。

于 2012-06-21T12:34:07.620 に答える