Android REST Clients実践-公式実現
3031 ワード
AndroidプログラムではREST Clientsが一般的な使用シーンですが、一部の書籍では入門したネットアクセスが紹介されています.プログラムで実際に使用するシーンからはまだまだですが、今日は自分の実践経験を紹介します
ネットワークアクセス
REST Clientネットワークアクセスの第一歩として,2.3以前にApache HttpClient,2.3以降にHttpURLConnectionを用いたと考えられる具体的な理由はここを参照してください.HttpClientやHttpURLConnectionの本にも紹介されているので,ここでは展開しません.しかし、実際にHttpURLConnectionを使用するのはまだ面倒で、私は一般的にネットワークリクエストが必要な場所でOkHttpを採用しています.ここではOkHttpの公式サイトのGETリクエストコードを引用してみてください.
非同期リクエスト
ネットワークリクエストのコードがあるが、Androidではuiスレッドでのネットワークリクエストは許されず、公式の解決策は2つある.新しいWork Threadを作成してネットワーク要求を行い、要求が終了したらHandlerを使用してUIスレッドに切り替えて結果処理を続行します.具体的な実装については、ここ2を参照する.AsyncTaskの使用
AsyncTaskは簡単に書けますが、一般的にはAsyncTaskが採用されています.2つのシナリオにも無数の実装例があり、ここでは注意すべき点について述べる.AsyncTaskは実はWork Thread+Handlerのパッケージ2と見なすことができる.AsyncTaskの一例では一度しか実行できないので、バックグラウンドタスク-』フロントタスクを繰り返すような切り替えシーンがあればWork Thread+Handlerの方が良いでしょう.3.AsyncTask自体にいくつかの欠陥があり、また、各バージョンのAsyncTask実装にもいくつかの違いがあります.使用時には、AsyncTaskのスレッドプールのポリシーが現在のシナリオを満たしているかどうかに注意する必要があります.一般にHandlerを使用する場合は匿名クラスで実現し,AsyncTaskを使用する場合は内部クラスを使用する.この2つの一般的なシーンでは、メモリの漏洩が発生しやすいので、注意して使用してください.5.AsyncTaskまたはWork Thread+Handlerのシナリオの実際の使用ではActivity LifeCycleの変更を考慮する必要があります.この内容は後で詳しく説明します.
シーケンス化
RESTFulインタフェースは一般的にjson結果を返し、HttpURLConnectionを使用してjson文字列を読みます.一般的には、データ・オブジェクトを使用します.この場合、読み込んだ文字列を適切なオブジェクトにシーケンス化します.最も一般的な解決策はGoogleのGsonです.ここではドキュメントコードの一部を引用して見てください.
まとめ
これで非同期ネットワークリクエストを対象とした公式シナリオはすべて議論済みですが、実際には皆さんはそうしません......だから実際のサンプルコードも見ていません.次は実践中の皆さんの実装シナリオについて議論します.
ネットワークアクセス
REST Clientネットワークアクセスの第一歩として,2.3以前にApache HttpClient,2.3以降にHttpURLConnectionを用いたと考えられる具体的な理由はここを参照してください.HttpClientやHttpURLConnectionの本にも紹介されているので,ここでは展開しません.しかし、実際にHttpURLConnectionを使用するのはまだ面倒で、私は一般的にネットワークリクエストが必要な場所でOkHttpを採用しています.ここではOkHttpの公式サイトのGETリクエストコードを引用してみてください.
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
非同期リクエスト
ネットワークリクエストのコードがあるが、Androidではuiスレッドでのネットワークリクエストは許されず、公式の解決策は2つある.新しいWork Threadを作成してネットワーク要求を行い、要求が終了したらHandlerを使用してUIスレッドに切り替えて結果処理を続行します.具体的な実装については、ここ2を参照する.AsyncTaskの使用
AsyncTaskは簡単に書けますが、一般的にはAsyncTaskが採用されています.2つのシナリオにも無数の実装例があり、ここでは注意すべき点について述べる.AsyncTaskは実はWork Thread+Handlerのパッケージ2と見なすことができる.AsyncTaskの一例では一度しか実行できないので、バックグラウンドタスク-』フロントタスクを繰り返すような切り替えシーンがあればWork Thread+Handlerの方が良いでしょう.3.AsyncTask自体にいくつかの欠陥があり、また、各バージョンのAsyncTask実装にもいくつかの違いがあります.使用時には、AsyncTaskのスレッドプールのポリシーが現在のシナリオを満たしているかどうかに注意する必要があります.一般にHandlerを使用する場合は匿名クラスで実現し,AsyncTaskを使用する場合は内部クラスを使用する.この2つの一般的なシーンでは、メモリの漏洩が発生しやすいので、注意して使用してください.5.AsyncTaskまたはWork Thread+Handlerのシナリオの実際の使用ではActivity LifeCycleの変更を考慮する必要があります.この内容は後で詳しく説明します.
シーケンス化
RESTFulインタフェースは一般的にjson結果を返し、HttpURLConnectionを使用してjson文字列を読みます.一般的には、データ・オブジェクトを使用します.この場合、読み込んだ文字列を適切なオブジェクトにシーケンス化します.最も一般的な解決策はGoogleのGsonです.ここではドキュメントコードの一部を引用して見てください.
class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives() {
// no-args constructor
}
}
(Serialization)
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
==> json is {"value1":1,"value2":"abc"}
Note that you can not serialize objects with circular references since that will result in infinite recursion.
(Deserialization)
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
==> obj2 is just like obj
まとめ
これで非同期ネットワークリクエストを対象とした公式シナリオはすべて議論済みですが、実際には皆さんはそうしません......だから実際のサンプルコードも見ていません.次は実践中の皆さんの実装シナリオについて議論します.