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


82

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

RESTサーバーは、いくつかのリソースを公開します。例:(GET)

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();

VirgilDobjanschiのプレゼンテーション「AndroidRESTクライアントアプリケーションの開発」を参照して、アクティビティのワーカースレッドでRESTリクエストを処理するのは良い考えではないことを学びました。代わりに私が使用する必要があるサービスのAPIを。

(ローカル)サービスにバインドするシングルトンServiceHelperを使用するというアイデアは気に入っていますが、サービスの概念が正しく理解されていなかったのではないかと心配しています。

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

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

教えていただけませんか!

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

前もって感謝します。

クラウス

編集:SOで見つかった同様のトピック(これを投稿した後)は、私を必要な方向に導きます(複雑な「Dobjanschiパターン」を最小限に抑えます):


1
Claszen、すべてのリクエストに対する単一のサービスと、各リクエストに対する専用サービスについて意見はありましたか?はいの場合は共有してください。私の場合のシナリオ:アプリで使用するRESTリクエストが多数[約20]あります。上記のGoogleI / Oでの貴重なセッションを見てきました。私の質問は、どちらがより良いアプローチかということです。単一のサービスですべてのリクエストを単一のサービスで処理するにはどうすればよいですか?または、リクエストごとに専用のサービスを提供しますか?順番に実行する必要のあるリクエストがいくつかあり、同時に実行できるリクエストもあります。助言がありますか ?

@ user778869最終的に、(「トップレベル」の)RESTリソース(「company」、「customer」など)ごとに1つのIntentServiceとResultReceiverを使用しました。これは一種の「自然な」構造であり、うまく機能することがわかりました。コードの重複が発生する可能性がありますが、すべてを1つのサービスで実行した場合、制御構造を過度に使用することはありません。
frVaBe 2011年

これは、AndroidRESTクライアントの実装を学ぶ人々にとって非常に役立つかもしれません。PDFに転記されたDobjanschiのプレゼンテーション:drive.google.com/file/d/0B2dn_3573C3RdlVpU2JBWXdSb3c/…–
Kay Zed

回答:


50

OverView

編集:

興味のある人は、RESTful androidを見てみることも検討してください。これにより、RESTfulAndroidについて詳しく知ることができます。

Dobjanschiモデルを実装しようとした経験から学んだことは、すべてが石で書かれているわけではなく、アプリごとにこれを行う方法の概要を説明しているだけですが、式は次のとおりです。

このアイデアに従ってください+あなた自身を追加してください=ハッピーAndroidアプリケーション

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


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

これにより、SyncAdapterを使用してデータを同期できるようになります。これについては、独自のSyncAdapterの作成で説明しています。

ContentProviderを作成します(ニーズに合っている場合)

この抽象化により、データベースにアクセスできるだけでなく、ServiceHelperにアクセスしてREST呼び出しを実行できます。これは、RESTArchを使用した1対1のマッピングメソッドを備えているためです。

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

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

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

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

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

ServiceHelperの階層化

この人は基本的に、ContentProviderから渡したパラメーターを使用してHttp(必ずしもプロトコルではありませんが最も一般的です)RESTメソッドを実行するサービスを開始します。コンテンツプロバイダーの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を実装して、サービスが完了したら、このブロードキャストを登録したアクティビティに通知し、再度クエリを実行します。この最後のステップはVirgillConferenceではないと思いますが、良い方法だと確信しています。

RESTMethodクラス

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

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

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

プロセッサ

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

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

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


ご回答有難うございます。最終的に、(「トップレベル」の)RESTリソース(「company」、「customer」など)ごとに1つのIntentServiceとResultReceiverを使用しました。Dobjanschiモデルは私には重すぎました。
frVaBe 2011年

よくbIntentServiceとResultReseiverを使用すると、おそらくサービス駆動型モデルである最初の記述シナリオを使用しますが、彼は通信にResultReceiverの代わりにBinderを使用しますが、私が言ったようにそれは石で書かれていません!。
ネクロネット2011年

私が質問をしたのは少し前のことで、私に合った解決策を見つけました。サンプルアプリケーションへのすべての参照を確認する可能性はありませんでしたが、これが最新の回答であるため、受け入れます。それでも、他のすべての回答も確認することをお勧めします。
frVaBe 2012

優れた暗示、すべての答えをチェックしてください、それらのすべてはたくさんの良いリソースとアイデアを持っています!! プログラミングAndroidの本YoniのJeremyとioschedソースのように。
ネクロネット2012

@Necronetこんにちは、あなたの有望なサンプルアプリに出くわしました-しかし、私はそれを構築するのに問題があります。どのバージョンのActionBarSherlockに対してビルドする必要があるかを教えていただけませんか(最新のABS 4.1では機能しないようです)。また、あなたの投稿から、あなたが目指しているDobjanschiのモデルのパターン(A、B、またはC)は実際にはわかりませんでした(おそらく、いくつかのバリエーションがありましたが、主に次のいずれかに焦点を当てていたと思います)パターン-パターンBだと思いますか?)ありがとう!
vaiomike 2012

17

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

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

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

プログラミングAndroidの将来のエディションでは、他の2つのアプローチに対応し、このGoogleプレゼンテーションの詳細を文書化する可能性があります。この章を読み終えたら、Googleの講演をご覧になることをお勧めします。

強くお勧めします。

Zigurd Mednieks、Laird Dornin、G。BlakeMeike、MasumiNakamuraによるAndroidのプログラミング。Copyright 2011 O'Reilly Media、Inc.、978-1-449-38969-7。


11

VirgilDobjanschiによる「AndroidRESTクライアントアプリケーションの開発」は、セッション中にソースコードが提示されなかった、またはセッション後に提供されなかったため、多くの議論につながりました。

  • リファレンス実装はhttp://datadroid.foxykeep.comから入手できます(GoogleIOセッションは/ presentationの下に記載されています)。独自のアプリケーションで使用できるライブラリです。
  • Android Priority Job Queueは、Dobjanschiの話に触発され、私にとって非常に有望に聞こえます。

より多くの実装を知っている場合はコメントしてください。


このおそらく有用なリンクを共有してくれてありがとう(現時点で詳細を見る機会はありません)
FrVaBe 2012年

それは解決策のように見えます。ありがとうございました !
Vincent Cantin 2012

7

この問題に対処するライブラリを開発しました:RoboSpice

ライブラリは、によって記述された「サービス・アプローチ」を使用しヴァージルDobjanschiニールGoodmannを、私たちは完全なオール・イン・ワンのソリューションを提供しています:

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

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


4

レトロフィットはここで非常に役立つ可能性があります。次のような非常に単純な構成からアダプターを構築します。

RetrofitはRESTAPIを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サービス= restAdapter.create(GitHubService.class); 生成されたGitHubServiceでの各呼び出しは、リモートWebサーバーにHTTPリクエストを送信します。

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

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

RetrofitRestAdapterから取得したアダプターは派生元ではないBaseAdapterため、このようにラッパーを作成する必要があります 。SOの質問ListFragment内でsetListAdapterを呼び出した後、ListViewが空になるのはなぜですか。



3

これは少し遅いですが、ここに話の最初のパターンを説明する記事があります:

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

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



0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.