0

サービスを開始してバインドするアクティビティがあります。このサービスは、いくつかの HttpPost を使用して AsyncTask を実行し、受信したデータを処理して、結果からいくつかの変数を取得します。サービスが HttpPost からデータを取得したらすぐに、これらのデータを使用してアクティビティの UI を更新するにはどうすればよいですか? ResultReceiver を使用する必要がありますか、それともより良い方法がありますか?

更新

BroadcastReceiverまたはObservable オブジェクトを使用すると思います。

4

2 に答える 2

1

いくつかの可能性があります:

Service は brodcast(sendBroadcast) を送信できます。あなたのアクティビティは、サービスに実装された broacastReceiver を登録するだけです。そのようなもの: あなたのサービス:

Intent intent = new Intent();
intent.setAction("youAction");    
intent.putExtra("url",uri.toString());
sendBroadcast(intent);

アプリケーションの AndroidManifest で:

<receiver android:name="MyReceiver" >
     <intent-filter>
          <action android:name="yourAction" />
     </intent-filter>
</receiver>

あなたの活動:

private class Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {

         String url = arg1.getExtras().getString("url");
         //Here you can update your UI
   }

このリンクはあなたを助けることができます: http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html

2 番目の方法は、サービスにリスナーを登録し、サービスでそのリスナーに通知することです。

あなたのサービスで:

 void onSomethingHappened()
 {
      activityListener.notifyProgressBar();
 }

 void subscribe(YourInterface listener)
 {
      actibityListener =  listener;
 }
 In you activity, after start you service:

 service.subscribe(this); 

ただし、より良い解決策を得るには、サービスの実装 (タイプ) を考慮する必要があります。

AndroidServiceに関するこのリンクは役に立ちます。

ただし、もう 1 つの重要な点は、選択は async task の実装方法に依存するということです。preExucute、doInBackground、onProgressUpdate、および postExecute の各メソッドで何を行うかによって異なります。

AndroidUIThread の外部で発生したイベントから UI を更新することに注意する必要があるため、UI を直接更新しようとすると問題が発生します。この問題を解決するには、アクティビティのメソッドrunOnUiThreadを使用するか、 Handlerを使用できます。

于 2013-02-28T13:17:48.437 に答える
0

doInBackground() でデータをダウンロードします。onpreExecute() で進行状況ダイアログを表示します。onPostExecute() でダイアログを閉じます。onPostExecute() のデータで UI を更新します。

于 2013-02-28T13:12:06.093 に答える