9

2年前、フラグメント、インテントサービス、カーソルローダーが登場しました。アプローチはまだ最新ですか、それともAndroid Restクライアントを設計するためのより良いまたは成熟したパターンがありますか?特にオプションBと比較してください(私には画像を投稿する権限がありませんが、代わりにこの投稿から画像を見つけることができます)。

コンテンツプロバイダーの部分が不可欠であることを私は知っています。サービスヘルパーとサービスコンポーネントはどうですか?これまで、startServiceメソッドはContextまたはそのサブクラスの性質です。これは、サービスヘルパーがアクティビティになることを意味します。したがって、コンテンツプロバイダーからアクティビティを開始するのはエレガントですか、それとも上部のアクティビティから開始する必要があります。

  • google io 2011 ioschedアプリのソースコードを掘り下げた方は、HomeActivityの静的クラスSyncStatusUpdaterFragmentをサービスヘルパーと見なしますが、SyncServiceを開始することはできませんでしたが、SyncServiceからのコールバックをリッスンします。 UIの更新をトリガーします。それで、それはVirgil Dobjanschiのアプローチの変化と見なすことができますか?

サービス、インテントサービス、asyncTask、およびスレッドがあります。私の意見では、インテントサービスは、リモートサーバーからのデータのメガパックの同期に適しています。そのため、彼らはioschedでそれを使用します。ただし、一般的なシナリオでは、アイテムの一部のみがリモートサーバーと同期されます。したがって、インテントサービスは重すぎます。サービスアプローチですら。この種のタスクを実行するために、コンテンツプロバイダーまたはそのコンポーネントでasyncTaskまたはスレッドを使用できますか。または、サービスを使用して、サービスヘルパー-サービス-プロセッサパスを通過する説得力のある理由がありますか。私は深刻なアプリケーションについて話している。

それで、あなたはどう思いますか?

4

1 に答える 1

2

したがって、コンテンツプロバイダーからアクティビティを開始するのはエレガントですか、それとも上部のアクティビティから開始する必要があります。

コンテンツプロバイダーからアクティビティを開始することは決してありません。AsyncTask、Service、またはContent Providerのリクエストであるかどうかにかかわらず、すべてはアクティビティから開始する必要があります...

AsyncTasksは一般的に悪い選択です。構成の変更(つまり、画面の向きの変更)を処理する場合、これらは単に欠陥があります。ローダーはこれに対する解決策ですが、難しい部分はネットワーク呼び出しと一緒にそれをラップすることです。1つの解決策は、カスタムローダー(AsyncTaskLoaderをサブクラス化)からネットワーク呼び出しを構築することです。

ただし、私の場合は、2010年のGoogleIOプレゼンテーションに従いました。Serviceオブジェクト(ネットワーククエリを実行するためのスレッドを起動する)でサーバーへの要求を管理するためのクラスServiceHelperを構築しました。ServiceHelperは、呼び出し元のアクティビティから作成できるResultReceiversを管理します。これにより、アクティビティは、クエリの開始時と終了時(またはエラー時)など、サービスリクエストからのイベントをリッスンできます。これらのスレッドはネットワーククエリを呼び出し、結果のデータをContentProviderに格納します(キャッシュし、必要に応じて複数のアクティビティで使用します)。

同時に、ネットワークスレッドが書き込むエンドポイントをリッスンするアクティビティにCursorLoaderがあります。明らかに、キャッシングポリシーやそのような実装のオーバーヘッドなど、自分で解決するための多くの中間点があります。しかし、それは実際には、構築しているアプリと統合しているAPIによって異なります。

そうです、2010年のプレゼンテーションはまだ有効だと思います。彼のプレゼンテーションには漠然とした領域がたくさんあり、今日も続いています。アプリに適したデザインを作成する必要があります

うまくいけば、私の考えがあなたが始めるのに役立つでしょう。

于 2012-07-14T06:18:29.220 に答える