web-dev-qa-db-ja.com

サンプルが必要Android REST Virgil Dobjanschiを実装するクライアントプロジェクトREST実装パターン

REST電話でAndroidクライアントを構築したい。

RESTサーバーはいくつかのリソースを公開します。 (取得する)

http://foo.bar/customer      List of all customer
http://foo.bar/customer/4711    The customer with id 4711
http://foo.bar/customer/vip     List of all VIP customer

http://foo.bar/company           List of all companys
http://foo.bar/company/4711     The company with the ID 4711
http://foo.bar/company/vip      List of all VIP companys

私は(と思う)RESTサーバーと通信して必要な情報を取得する方法を知っています。このようなAPIでRESTクライアントクラスを実装します

public List<Customer> getCustomers();
public Customer getCustomer(final String id);
public List<Customer> getVipCustomer();

public List<Company> getCompanies();
public Customer getCompany(final String id);
public List<Customer> getVipCompanies();

Virgil Dobjanschiのプレゼンテーション「 Developing Android REST client applications 」を参照して、RESTアクティビティのワーカースレッドで要求します。代わりに Service APIを使用する必要があります。

(ローカル)サービスにバインドするシングルトンServiceHelperを持つというアイデアは好きですが、サービスコンセプトが正しく理解できなかったのではないかと心配しています。

今のところ、REST呼び出し結果(サービスで非同期に行われた)を呼び出し元アクティビティに報告する方法がわかりません。また、すべてのRESTリクエスト(異なる戻り値のタイプ)を処理する1つのサービスが必要なのか、各RESTリクエストに専用のサービスが必要なのか疑問に思います。

おそらく他にも多くの理解上の問題があるので、私にとって最適なものは、サンプルアプリケーションで、これが私のニーズに合っています。私のユースケースは珍しいことではなく、サンプルアプリケーションがそこにあることを願っています。

教えてください!

正しい実装の方向を示す他の提案も役立ちます(Android API-Demoは私のユースケースと一致しません)。

前もって感謝します。

クラウス

[〜#〜] edit [〜#〜]:(これを投稿した後)SOで見つかった同様のトピック必要な方向(複雑な「Dobjanschiパターン」を最小化する):

81
FrVaBe

概要

編集:

興味のある人は RESTful Android を検討することも検討してください。これにより、より良い外観が得られるかもしれません。

Dobjanschiモデルを実装しようとした経験から私が学んだことは、すべてが石で書かれているわけではなく、彼があなたにこれを行うための概要をアプリからアプリに変更するかもしれないだけで与えているということですが、式は次のとおりです:

このアイデアに従ってください+独自の追加= Happy Android application

一部のアプリのモデルは、SyncAdapterのアカウントを必要としない要件や、C2DMを使用する要件と異なる場合があります。最近作業したこのモデルは、誰かを助けるかもしれません。


AccountとAccountManagerを持つアプリケーションを作成します

SyncAdapterを使用してデータを同期できます。これは 独自のSyncAdapterの作成 で説明されています

ContentProvider を作成します(必要に応じて)

この抽象化により、データベースにアクセスできるだけでなく、ServiceHelperにアクセスしてREST呼び出しを実行できます。これには、RESTアーチ。

コンテンツプロバイダー| RESTメソッド

クエリ----------------> GET

挿入----------------> PUT

更新----------------> POST

削除---------------->削除

ServiceHelperの階層化

この男は基本的にHttpを実行するサービスを開始します(必ずしもプロトコルではありませんが、最も一般的です)REST ContentProviderから渡したパラメーターを使用したメソッド。コンテンツプロバイダーのUriMatcherから取得された一致整数。これにより、アクセスするリソースRESTリソース、つまり.

class ServiceHelper{

    public static void execute(Context context,int match,String parameters){
//find the service resource (/path/to/remote/service with the match
//start service with parameters 
    }

}

サービス

実行され(ほとんどの場合IntentServiceを使用します)、ヘルパーから渡されたパラメーターを使用してRESTMethodに移動します。サービスはバックグラウンドで物事を実行するのに適しています。

また、BroadCastReceiverを実装して、サービスがその作業を完了したら、このブロードキャストを登録したアクティビティに再度通知し、再度クエリを実行します。この最後のステップはバージル会議ではないと思いますが、良い方法だと確信しています。

RESTMethodクラス

パラメーターを取得し、WSリソース( http://myservice.com/service/path )がパラメーターを追加し、すべてを準備し、呼び出しを実行し、応答を保存します。

認証トークンが必要な場合は、AccountManagerから要求できます。認証のためにサービスの呼び出しが失敗した場合、認証トークンを無効にして再認証して新しいトークンを取得できます。

最後に、RESTMethodは、マッチャーに基づいてプロセッサを作成し、応答を渡すことに関係なく、XMLまたはJSONを提供します。

プロセッサ

応答の解析とローカルでの挿入を担当します。

サンプルアプリケーション?もちろん!

また、 Eli-G を参照するテストアプリケーションに興味がある場合は、最良の例ではないかもしれませんが、Service RESTアプローチに従って構築されますServiceHelper、Processor、ContentProvider、Loader、およびBroadcastを使用します。

50
Necronet

Programming Android には、VirgilのGoogle I/Oトークの「オプションB:ContentProvider APIを使用する」専用の完全な章(13.コンテンツプロバイダーの探索)があります。

このアプローチの利点を理解しているのは私たちだけではありません。 2010年5月のGoogle I/Oカンファレンスで、GoogleのVirgil Dobjanschiは、コンテンツプロバイダーを使用してRESTful WebサービスをAndroidアプリケーションに統合するための次の3つのパターンを概説した講演を行いました...

この章では、2番目のフィンチビデオの例を使用して、2番目のパターンを詳しく調べます。この戦略は、アプリケーションに多くの重要な利点をもたらします。このアプローチがネットワーク操作をAndroid MVCに統合する優雅さのため、「Network MVC」という名前を付けました。

プログラミングの将来の版Androidは、他の2つのアプローチに対処し、このGoogleプレゼンテーションの詳細を文書化する可能性があります。この章を読み終えたら、Googleの講演をご覧ください。

強くお勧めします。

プログラミングAndroid by Zigurd Mednieks、Laird Dornin、G。Blake Meike、MasumiNakamura。Copyright2011 O’Reilly Media、Inc.、978-1-449-38969-7。

17
Jeremy Haberman

Virgil Dobjanschiによる "Developing Android RESTクライアントアプリケーション")は、セッション中にソースコードが提示されなかった、またはその後提供されなかったため、多くの議論につながりました。

  • リファレンス実装は http://datadroid.foxykeep.com (Google IOセッションは/ presentationで言及されています)で利用可能です。独自のアプリケーションで使用します。
  • Android Priority Job Queue はDobjanschiの講演に触発され、私にとって非常に有望です。

さらに実装を知っている場合はコメントしてください。

11
ChrLipp

この問題を解決するライブラリを開発しました: RoboSpice

ライブラリは Virgil Dobjanschi および Neil Goodmann で記述された「サービスアプローチ」を使用しますが、次のような完全なオールインワンソリューションを提供します。

  • pOJOを返すネットワークリクエストを非同期で(バックグラウンドAndroidServiceで)実行します(例:RESTリクエスト)
  • 結果をキャッシュします(Json、Xml、フラットテキストファイル、またはバイナリファイル)
  • ネットワーク要求の結果がまだ生きている場合、アクティビティ(またはその他のコンテキスト)に通知します
  • アクティビティがもう生きていない場合、結果をアクティビティに通知しません
  • uIスレッドでアクティビティを通知します
  • シンプルだが堅牢な例外処理モデルを使用します
  • 複数のContentServiceをサポートして、異なるWebサービスの結果を集約します
  • リクエスト実行のマルチスレッド化をサポート
  • 強く型付けされています!
  • オープンソースです;)
  • そしてテスト済み

コミュニティからのフィードバックを実際に探しています。

7
Snicolas

Retrofitは非常に役立つ場合があります。次のような非常に単純な構成からアダプタを構築します。

Retrofitは、REST APIをJavaインターフェイスに変換します。

public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@Path("user") String user);
}

RestAdapterクラスは、GitHubServiceインターフェースの実装を生成します。

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .build();

GitHubService service = restAdapter.create(GitHubService.class);生成されたGitHubServiceの各呼び出しは、リモートWebサーバーに対してHTTPリクエストを作成します。

List<Repo> repos = service.listRepos("octocat");

詳細については、公式サイトをご覧ください: http://square.github.io/retrofit/

:Retrofitから取得するアダプターRestAdapterBaseAdapterから派生したものではありません。何らかの方法でラッパーを作成する必要がありますこのようなSO question ListFragment内でsetListAdapterを呼び出した後、ListViewが空になるのはなぜですか?

4
MhdSyrwan

Googleの公式の I/O 2010アプリ のソースコード、特に初心者向けのソースコード、特に SyncServiceioサブパッケージ のさまざまなクラスをチェックしてください。 =。

3
Yoni Samlan

これは少し遅れていますが、ここでは講演の最初のパターンを説明する記事があります。

http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p

私が最初のパターンで気に入っているのは、残りのメソッドへのインターフェースがプレーンなクラスであり、コンテンツプロバイダーがデータベースへのアクセスを提供するだけであることです。

3
nzjoel

良いニュースだ。サービスヘルパーの実装はこちらから入手できます。 https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper これはオープンソースプロジェクトです(Apache 2)。私はプロジェクトの始まりです。実行するパターンを定義したプロジェクトを実行しましたが、クリーンなライブラリを作成するためのコードをまだ抽出していません。それはすぐに行われます。