2011-11-10 6 views
0

私は、Webサービスに呼び出しを転送するサービスと、それらの呼び出しを行ういくつかのアクティビティでアプリケーションを開発しています。アクティビティは、これらの呼び出しの結果を処理する必要があります。たとえば、サービスにwriteCommentメソッドがあり、Webサービスにアクセスして新しく書き込まれたコメントに関する情報を返します。アクティビティから長いサービスメソッドを呼び出す - ベストプラクティス

今、私はアクティビティにすべてのスレッドを処理させます。アクティビティはサービスをバインドし、バインドされたサービスのwriteCommentメソッドを呼び出すAsyncTaskを使用します。

AsyncTaskの実行中にアクティビティが停止しない限り、すべて正常に動作します。それが起こると(携帯電話をひっくり返すと簡単に起こる)、onPostExecuteでUIを更新しようとするとAsyncTaskが致命的に死にます。私はこれを修正する方法が完全にはわかりません - 私はを実行するは、サーバーが更新されたことをユーザーに知らせる必要があります。

サービスにコールバックを登録しても、サービスに通知する必要があるため、まだちょっと切れています。アクティビティが変更されたため通知する必要はありません最初のアクティビティのonDestoryを作成し、2番目のアクティビティのonCreateに再登録します。また、onDestroyの後でonCreateの前に非同期タスクが完了するケースを処理する必要があります。

この場合のベストプラクティスとは何でしょうか?

ありがとう、 Itay。

答えて

1

私の直感は、サービスにスレッドを処理させるように指示します。サービスは、アクティビティよりもはるかに一時的ではありますが(ある程度一時的ですが)、もはや存在しないコンテキスト(アクティビティまたはサービス)とやりとりするスレッドの問題が少なくなります。 IntentServiceクラスを見ましたか?それはあなたのためのスレッドの多くを処理します。

+0

IntentServiceは実際にスレッドを処理しますが、コールバックは処理しません。 – zmbq

1

私のアプリでは、サービスでデータをレンダリングする必要がある長期実行サービスとアクティビティがあります。このサービスは変更があったときにアクティビティにもpingを実行しますが、アクティビティでもサービスにクエリを実行できます。私がこれに近づく方法は2倍でした。

まず、アクティビティからサービスにメッセージを送信するために、アクティビティをサービスにバインドします。

第2に、サービスはブロードキャストで通知を送信し、アクティビティはそれらのブロードキャストをリッスンします。私はそれをonResumeアクティビティで設定し、onPauseでそれを引き裂きました。私はこれがあなたが欠けている部分だと思います。

+0

はい、そうかもしれません。私はしばらくこれをおもちゃにしておく必要があります。私はAsyncTaskには本当に不満ですが、それはあなたが本当に気にしていないタスクにしか良いものではないようです。 – zmbq

関連する問題