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パターン」を最小化する):
編集:
興味のある人は RESTful Android を検討することも検討してください。これにより、より良い外観が得られるかもしれません。
Dobjanschiモデルを実装しようとした経験から私が学んだことは、すべてが石で書かれているわけではなく、彼があなたにこれを行うための概要をアプリからアプリに変更するかもしれないだけで与えているということですが、式は次のとおりです:
このアイデアに従ってください+独自の追加= Happy Android application
一部のアプリのモデルは、SyncAdapterのアカウントを必要としない要件や、C2DMを使用する要件と異なる場合があります。最近作業したこのモデルは、誰かを助けるかもしれません。
SyncAdapterを使用してデータを同期できます。これは 独自のSyncAdapterの作成 で説明されています
この抽象化により、データベースにアクセスできるだけでなく、ServiceHelperにアクセスしてREST呼び出しを実行できます。これには、RESTアーチ。
コンテンツプロバイダー| RESTメソッド
クエリ----------------> GET
挿入----------------> PUT
更新----------------> POST
削除---------------->削除
この男は基本的に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を実装して、サービスがその作業を完了したら、このブロードキャストを登録したアクティビティに再度通知し、再度クエリを実行します。この最後のステップはバージル会議ではないと思いますが、良い方法だと確信しています。
パラメーターを取得し、WSリソース( http://myservice.com/service/path )がパラメーターを追加し、すべてを準備し、呼び出しを実行し、応答を保存します。
認証トークンが必要な場合は、AccountManagerから要求できます。認証のためにサービスの呼び出しが失敗した場合、認証トークンを無効にして再認証して新しいトークンを取得できます。
最後に、RESTMethodは、マッチャーに基づいてプロセッサを作成し、応答を渡すことに関係なく、XMLまたはJSONを提供します。
応答の解析とローカルでの挿入を担当します。
また、 Eli-G を参照するテストアプリケーションに興味がある場合は、最良の例ではないかもしれませんが、Service RESTアプローチに従って構築されますServiceHelper、Processor、ContentProvider、Loader、およびBroadcastを使用します。
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。
Virgil Dobjanschiによる "Developing Android RESTクライアントアプリケーション")は、セッション中にソースコードが提示されなかった、またはその後提供されなかったため、多くの議論につながりました。
さらに実装を知っている場合はコメントしてください。
この問題を解決するライブラリを開発しました: RoboSpice 。
ライブラリは Virgil Dobjanschi および Neil Goodmann で記述された「サービスアプローチ」を使用しますが、次のような完全なオールインワンソリューションを提供します。
コミュニティからのフィードバックを実際に探しています。
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から取得するアダプターRestAdapter
はBaseAdapter
から派生したものではありません。何らかの方法でラッパーを作成する必要がありますこのようなSO question ListFragment内でsetListAdapterを呼び出した後、ListViewが空になるのはなぜですか?
Googleの公式の I/O 2010アプリ のソースコード、特に初心者向けのソースコード、特に SyncService と ioサブパッケージ のさまざまなクラスをチェックしてください。 =。
これは少し遅れていますが、ここでは講演の最初のパターンを説明する記事があります。
http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p
私が最初のパターンで気に入っているのは、残りのメソッドへのインターフェースがプレーンなクラスであり、コンテンツプロバイダーがデータベースへのアクセスを提供するだけであることです。
良いニュースだ。サービスヘルパーの実装はこちらから入手できます。 https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper これはオープンソースプロジェクトです(Apache 2)。私はプロジェクトの始まりです。実行するパターンを定義したプロジェクトを実行しましたが、クリーンなライブラリを作成するためのコードをまだ抽出していません。それはすぐに行われます。