Androidの開発から現在に至るまで、ネットワークフレームワークは更新されており、現在、4つの主要な成熟したフレームワークがあります。この記事では、主要なフレームワークの実装原理について簡単に分析します。具体的な使用方法については、記事に記載されているリンクを参照してください。
Androidメインストリームフレームワーク
後付け
OKhttp
ボレー
AsyncHttpClient
後付け
特徴
- 動的プロキシ
- Adapt変換呼び出しオブジェクト
- 機能分析、ネットワーク要求、データ変換
インターフェース
public interface ApiService{
// 与Rxjava结合使用
@POST(NetUrl.HOME_URL)
public Obserable<HttpResult<HomeResponse>> getHomeList(@BODY BodyRequest body);
@GET(NetUrl.VERSION_URL)
public Obserable<HttpResult<VersionResponse>> getVersionDetail();
// 没有添加Call回调处理,直接返回Okhttp的Call
@Get(NetUrl.USER_URL)
public Call<HttpResult<UserResponse>> getUser(@Query("uid") long uid)
}
原理
画像
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.BASE_URL) // baseUrl 以/结尾
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 添加Call回调
.addConverterFactory(GsonConverterFactory.create()) // 解析器
.client(okHttpClient) //配置okHttpClient
.build();
ApiService service = retrofit.create(ApiService.class);
// 在业务层调用ApiService的方法
service.getVersionDetail();
1. retrofit.create(ApiService.class)
レトロフィットは、動的プロキシを介してインターフェイスをOkhttpにバインドします
public <T> T create(final Class<T> service) {
...
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
...
ServiceMethod<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
2. Okhttpを内部で維持します。ネットワークリクエストはOkhttpによって完了します。Retrofitは生産のみを担当します
3.Callコールバック。これは実際にはOkhttpのCallコールバックであり、設定.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
に対応しています。そのような設定がない場合、Call<Bean>
オブジェクトが返されます
4. Callコールバックメソッドのデータ分析は構成に対応します.addConverterFactory(GsonConverterFactory.create())
。これはJsonfast
、分析変換ファクトリまたはカスタム分析ファクトリにRetrofit
することもできます。特定のデータ分析インターフェースを実装するだけで済みます。GsonConverterFactory
実装を参照できます。
OKhttp
原理
OkHttpの最下層はHTTPまたはHTTPSリクエストを送信し、Javaソケットを介して応答を受信することですが、OkHttpは接続プーリングの概念を実装しています。つまり、同じホストからの複数のリクエストに対して、毎回HTTPリクエストを送信する代わりに実際にソケット接続を共有できます。接続プールの概念が実現されるように、基になるソケットを閉じます。OkHttpは、ソケットの読み取りおよび書き込み操作に使用されるOkIoライブラリをカプセル化します。
画像
OkHttpの主人公
OkHttpClient
使用可能な呼び出しのための工場 HTTPリクエストを送信し、その応答を読み取ること。
工場の生産、生産コールを担当します
リクエスト
OkHttpリクエスト。リクエストメソッド、リクエストパラメータ、リクエストヘッダーなどのリクエスト情報をRequest.Builder().build
作成してRequest.Builder()
設定します。get/post
RequestBody
header
コール
ディスパッチャCallはトップレベルのインターフェースであり、RealCallは特定の実装を担当します。責任Request
とResponse
ブリッジ意志Request
におけるexecute()
同期方法の実行出力Response
、あるいはRequest
するenqueue(callback)
非同期スケジューリングに加えました。
ディスパッチャー(ThreadPoolExecutor)
スケジューリングスレッドプールDisptcherは、高い同時実行性と低いブロッキングを実現します。Dequeをキャッシュとして使用すると、先入れ先出し順の実行
タスクは、ロックを使用する代わりに、try / finallyで終了した関数を呼び出してタスクキューの実行順序を制御し、コーディングの複雑さを軽減してパフォーマンスを向上させます
。Callが非同期に要求された場合のみ、 Dispatcherのスケジューリング作業のみをトリガーします。
応答
コード、メッセージ、ヘッダー、本文などの情報を含む応答
// 1.创建Client
OkHttpClient client = new OkHttpClient.Builder().build()
// 2.创建Request
Request reuqest = new Request.Builder().get().url(url).builder()
// 3.call execute同步
Response response = client.newCall(request).execute()
// 异步,回调在子线程中执行
client.newCall(request).enqueue(new Callback{
@Override
public void onFailure(Call call, IOException e){
}
@Override
public void onResponse(Call call, Response response){
}
})
ボレー
画像
RequestQueue
- StringRequest
- JsonRequest
- ImageRequest
ダイアパッチスレッド
- MainDispatcher
- CacheDispatcher
- NetworkDispatcher
- ImageDispatcher
データインターフェイスの取得
-
HttpStack
はHttpリクエストを処理し、リクエスト結果を返します。現在、Volleyには、HttpURLConnectionに基づくHurlStackとApache HttpClientに基づくHttpClientStackがあります。 -
ResponseDelivery(現在、ExecutorDeliveryのみに基づく戻り結果配布インターフェースは、入力パラメーターハンドラーに対応するスレッドに配布されます。)
データ
- キャッシュ(ボレーは、デフォルトでSDカードに基づくDiskBasedCacheを使用します)
- ネットワーク(NetworkResponse)
まとめ
2つのディスパッチスレッドを介してRequestQueueから継続的にリクエストをフェッチし、キャッシュされているかどうかに応じて、キャッシュまたはネットワークの2種類のデータ取得インターフェイスのいずれかを呼び出し、メモリキャッシュまたはサーバーからリクエストされたデータを取得し、ResponseDeliveryに渡して結果の配信とコールバックを行います。対処します。
AysncHttpClient
Apache HttpClientは非同期スレッド管理を使用してリクエストスレッドを管理します。ここでは主な分析は行いません。。。
フレームワーク情報/公式ドキュメントリファレンス
著者:ReeseLuoの
リンクします。https://www.jianshu.com/p/7a970db4e7cf
出典:ジェーンの本が
著者によって著作権で保護されています。営利目的の複製については、作者に連絡して承認を得てください。非営利目的の複製については、出典を明記してください。