ネットワーク要求を効率的にカプセル化するには、次の側面を考慮する必要があります。
- リクエスト メソッド、リクエスト パラメータ、リクエスト ヘッダー、URL およびその他の情報を含むネットワーク リクエスト オブジェクトをカプセル化します。
- リクエストの成功、リクエストの失敗、リクエストのエラー、その他の結果のコールバック メソッドを含む、ネットワーク リクエストの結果コールバックをカプセル化します。
- ネットワーク要求の同時処理では、同時に複数の要求をサポートする必要があります。
- GET リクエストと POST リクエストのパラメータは異なる方法でカプセル化されているため、さまざまなリクエスト タイプに適合させる必要があります。
- ネットワーク リクエストの再試行処理では、リクエストが失敗したときにメカニズムを自動的に再試行できる必要があります。
- ネットワーク リクエストのキャッシュ処理: 特定のリクエストについては、リクエストの数を減らすためにキャッシュ メカニズムを追加できます。
高度で効率的なネットワーク リクエスト ライブラリでは、ネットワーク リクエストの高度なカプセル化と最適化を達成し、その後の開発作業を容易にするために、上記の点を包括的に考慮する必要があります。市場には、OkHttp、Retrofit など、選択できる優れたネットワーク リクエスト ライブラリがすでにいくつかあります。もちろん、特定のニーズに応じて独自のネットワーク リクエスト ライブラリを開発することもできます。
OkHttp と Retrofit は、Android で一般的に使用されるネットワーク リクエスト ライブラリです。これらを使用してネットワーク要求を行うプロセスでは、高度で効率的なカプセル化を実行して、コードの再利用とパフォーマンスの最適化を実現できます。具体的には:
-
統合ネットワーク構成: タイムアウト、リクエストヘッダー情報などの統合ネットワーク構成をアプリケーションで実行できます。これにより、ネットワーク リクエストはアプリケーション全体で高度な安定性と一貫性を示すことができます。
-
コールバック インターフェイスのカプセル化: ネットワーク リクエストの完了後に返されるデータをコールバック インターフェイスにカプセル化して、リクエストごとにコールバック インターフェイスをリセットする必要性を回避します。同時に、ネットワーク要求によって返されるデータ型は、汎用制約を通じて特定のエンティティ クラスとして指定できます。
-
ネットワーク リクエストのパブリック メソッドをカプセル化する: さまざまなタイプのネットワーク リクエスト (GET、POST など) とリクエスト パラメーターをパブリック メソッドに統合し、同様のコードを繰り返し記述することを回避します。さらに、リクエスト パラメーターの構成可能性は、ビルダー モードを通じて実現できます。
-
例外処理メカニズム: ネットワーク接続エラー、データ解析エラーなど、さまざまな種類のエラーを個別に処理します。例外のキャプチャと処理は、例外クラスとインターセプターをカスタマイズすることで実現できます。
-
キャッシュ メカニズム: 実際のニーズに応じてディスク キャッシュとメモリ キャッシュを構成して、リクエストの繰り返しを回避し、ネットワーク リクエストの数を減らすことができます。
上記のカプセル化方法により、コードの再利用性とネットワーク リクエストの保守性が大幅に向上し、アプリケーションの応答速度とユーザー エクスペリエンスも向上します。
たとえば、OkHttp パッケージ
public class OkHttpManager {
private static OkHttpManager mInstance;
private OkHttpClient mOkHttpClient;
private OkHttpManager() {
mOkHttpClient = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build();
}
public static OkHttpManager getInstance() {
if (mInstance == null) {
synchronized (OkHttpManager.class) {
if (mInstance == null) {
mInstance = new OkHttpManager();
}
}
}
return mInstance;
}
public void asyncGet(String url, Map<String, String> params, Callback callback) {
Request request = new Request.Builder()
.url(url)
.get()
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(callback);
}
public void asyncPost(String url, Map<String, String> params, Callback callback) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
Request request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(callback);
}
}
その中で、ネットワーク リクエストを管理できる OkHttpClient シングルトン オブジェクトを定義します。ここでは、2 つのネットワーク リクエスト メソッドを定義します。asyncGet と asyncPost は、それぞれ非同期 GET リクエストと POST リクエストを表します。上記のネットワーク リクエストを呼び出すときは、リクエストされた URL とパラメータ、および Callback コールバック関数を指定するだけです。ここでの Callback オブジェクトは OkHttp の組み込みコールバック インターフェイスであり、ネットワーク リクエストの結果を処理するために使用されます。ニーズに応じて、さまざまなコールバック関数を選択してリクエスト結果を処理できます。
次はRetrofitのカプセル化実装です。
public class RetrofitManager {
private static RetrofitManager mInstance;
private Retrofit mRetrofit;
private RetrofitManager() {
mRetrofit = new Retrofit.Builder()
.baseUrl(ApiService.BASE_URL)
.client(OkHttpManager.getInstance().getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public static RetrofitManager getInstance() {
if (mInstance == null) {
synchronized (RetrofitManager.class) {
if (mInstance == null) {
mInstance = new RetrofitManager();
}
}
}
return mInstance;
}
public ApiService getApiService() {
return mRetrofit.create(ApiService.class);
}
public static void reset() {
mInstance = null;
}
}
Retrofit のカプセル化された実装では、Retrofit リクエストを管理するためのシングルトン オブジェクトも定義します。ここで注意する必要があるのは、Retrofit は OkHttp に基づいてネットワーク リクエストを実装するため、OkHttpClient オブジェクトを Retrofit の Builder オブジェクトに渡す必要があるということです。さらに、ここでは解析ツールとして Gson を使用しています。これには、GsonConverterFactory.create() ステートメントを Retrofit Builder ステートメントに追加する必要があります。
コード内での Retrofit のカプセル化は、さまざまなインターフェイス メソッドに従ってさまざまなネットワーク リクエストを完了するインターフェイス ApiService を定義することです。例えば:
public interface ApiService {
String BASE_URL = "https://api.example.com/";
@GET("user/{id}")
Call<User> getUser(@Path("id") String userId);
@FormUrlEncoded
@POST("user/edit")
Call<Result> updateUser(@FieldMap Map<String, String> params);
}
Retrofit を使用する場合、RetrofitManager の getApiService() メソッドを呼び出して ApiService オブジェクトを取得するだけで済みます。その後、基礎となるネットワーク リクエストの実装プロセスに注意を払うことなく、そこで宣言されているさまざまなインターフェイス メソッドを使用できます。
キャッシュ メカニズムの実装に関しては、ディスク キャッシュはインターセプターを介して実装でき、キャッシュ サイズとタイムアウトは OkHttpClient で設定できます。さらに、メモリ キャッシュは、LruCache などのキャッシュ テクノロジを通じて実装できます。コンテンツのこの部分は比較的複雑ですが、実際のニーズに応じて具体的に実装できます。