ここでは、それぞれ独自のメリットとデメリット、より多くのシーン選択への応用を持って、私はネットワークのフレームワークを使用したものです。
ます。http://ip.tianqiapi.com IP = xxx.xxx.xxx.xxx?テストクエリインターフェイスのIPアドレスを使用してテスト 。
:ノート要求するネットワークの問題へのAndroidのポイントで
1権限:<uses-permission android:name="android.permission.INTERNET"/>
。
2.メインスレッドは、それが与えられます、ネットワークを要求することができます。
サブスレッド3. UI、エラーを操作することができません。
データのセキュリティを確保するために4、アンドロイドP HTTPで使用することはできません、httpsに変更したいのですが、AndroidManifest.xmlファイルにAndroidのアプリケーションタグを増やしてます。httpsを強制避けるためにusesCleartextTraffic =「true」を、当然のことながら、他の方法がありますだけでなく、一つが、一種類で十分です。(またはhttpsにアップグレード彼らのサービスをお勧めします)。
A、HttpURLConnectionの
最初は間違いなくHttpURLConnectionの、彼はJavaの段階でのネットワークプログラミングを学び始めたということです。
まず、URLがHttpURLConnectionが開かれ、URLを構築し、データを読んで、最も基本的な操作であるIOを使用してストリーミング。要求タイプを変更するには、よりsetRequestMethod(「GET」)することができます。操作の他の種類は非常に面倒です。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread() {
@Override
public void run() {
super.run();
doHttpURLConnection("http://ip.tianqiapi.com?ip=39.156.66.18");
}
}.start();
}
private void doHttpURLConnection(String u){
try {
URL url =new URL(u);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
InputStreamReader inputStreamReader =new InputStreamReader(urlConnection.getInputStream());
BufferedReader bufferedReader =new BufferedReader(inputStreamReader);
String temp="";
StringBuffer stringBuffer =new StringBuffer();
while ((temp=bufferedReader.readLine())!=null){
stringBuffer.append(temp);
}
Log.i(TAG, "doHttpURLConnection: "+stringBuffer);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
二、Okhttp
次は、Okhttpある会社広場が提供するネットワークライブラリの火、です。します。https://github.com/square/okhttp重複を避けるために、このようなネットワーク要求に応じてキャッシュの使用など多くの利点は、住所は、迎撃などを持っている、があります。
最初は、彼の最新の導入は4.3.1です。
implementation("com.squareup.okhttp3:okhttp:4.3.1")
APIは非常に使いやすい、最初に構築されOkHttpClientは、世界的には、続いて、このような読み取りタイムアウト時間などの内部ビルダーセットパラメータ、一度だけ、オブジェクトを構築することができ、初期化され()Getリクエスト場合はリクエストオブジェクト、Request.Builderによって構築、直接の使用に.get()、リクエストがPOSTの場合、また、渡されたrequestBodyオブジェクトは静的メソッドで作成することができます使用.post(requestBody)は、作成requestBody、あなたはまた、そのようなFormBodyとしてそのサブクラスのいずれかを使用することができます。
同期および非同期、同期にOkhttp要求それがある場合、)(OhttpClitent.executeを使用し、それが非同期である場合、)(エンキューを使用する必要があり、コールバックアドレスを渡します。
コールバックは、二つの方法、コールバックの失敗と成功を含め、コールバックインタフェースであるONFAILUREコールバックonResponse、response.bodyによって()responseBody応答オブジェクトを取得することができ、文字列をResponseBody.stringに変換することにより、最も簡単な方法はないのtoString()!!! UTF8エンコーディングを使用して、応答ヘッダのコンテンツタイプが存在しない場合は、特に指定が、文字列のメソッドのみOkhttpがリソースを解放します呼び出した後、一度呼び出すことができる、ということに注意して、2回目の呼び出しエラーそうエンコーディング。レスポンスオブジェクトが大きすぎる場合、それはOutOfMemoryErrorが発生することがあり
private void dpOkHttp(String u){
OkHttpClient httpClient =new OkHttpClient();
FormBody body =new FormBody.Builder().build();
Request request =new Request.Builder()
.url(u)
.post(body)
.build();
String string = null;
//同步
try {
string = httpClient.newCall(request).execute().body().string();
Log.i(TAG, "dpOkHttp: "+string);
} catch (IOException e) {
e.printStackTrace();
}
//异步
httpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.i(TAG, "onResponse: "+response.body().string());
}
});
}
三、okhttputils
これは、頻繁に使用されるデモを書いている時間の前に、それはまた、非常にシンプルで、張香港ヤングレート神Okhttpライブラリパッケージです。具体的な詳細はhttps://github.com/hongyangAndroid/okhttputilsを使用して表示することができます。対応しているバージョンに注意してください。
implementation 'com.zhy:okhttputils:2.6.2'
implementation("com.squareup.okhttp3:okhttp:3.3.1")
private void doOkhttpUtil(String u){
OkHttpClient httpClient =new OkHttpClient.Builder()
.build();
OkHttpUtils.initClient(httpClient);
OkHttpUtils.get()
.url(u)
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
e.printStackTrace();
}
@Override
public void onResponse(String response, int id) {
Log.i(TAG, "onResponse: "+response);
}
});
}
四、バレーボール
グールI / O 2013ネットワーク通信ライブラリに公開された、利点は、頻繁な場合、自動スケジューリングネットワーク要求、優先サポート要求、支持解除要求がキャンセル以上の単一の要求することが可能である等、データ通信の場合ではなく、 、ジャーパッケージのサイズが非常に小さく、バレーボールのコールバック時間がメインスレッドであり、直接的にもメインスレッドでUI、okhttputilsを操作することができますが、Okhttpは、必要がハンドラによって対処することがありません。そのようなファイルがダウンロードされ、一般的な画像の読み込みなどの欠点もあります。
これはhttps://developer.android.google.cn/training/volley詳細を表示することができます。
最初は、ただ一度だけREQUESTQUEUE要求キュー、グローバル初期設定を構築し、その後StringRequest、ImageRequest、ClearCacheRequest、JsonRequest 4つのサブクラスは、リクエストオブジェクトを要求構築することがあります。タグがリクエストに提供することができる、及びRequestQueue.cancelAll(タグ)によってキャンセルすることができます。`
implementation 'com.android.volley:volley:1.1.1'
private void doVolley(String u) {
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest stringRequest = new StringRequest(Request.Method.GET,u, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i(TAG, Thread.currentThread().getName()+" onResponse: " + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
stringRequest.setTag("tag");
Request<String> request = requestQueue.add(stringRequest);
requestQueue.cancelAll("tag");
}
五、レトロフィット
これは、同社の最初の広場で、またOkhttpが最終的Okhttpネットワーク要求によって完成し、拡張ベース、およびレトロフィットパッケージインタフェース要求する責任があります。私はこれを使用しています。
彼のアドレスhttps://square.github.io/retrofit/またはhttps://github.com/square/retrofit
上記の4つの非常にスタイルですから、全体の操作が完了するメモやインターフェースに依存している改造、言葉遣いは異なっています。
implementation("com.squareup.okhttp3:okhttp:3.3.1")
implementation 'com.squareup.retrofit2:retrofit:2.7.1'
まず、<T>では、@ GET(「/」)インターフェース、戻り値コールを作成する要求パスを表し、@クエリパラメータ、すなわち?データに続いて
public interface Apis {
@GET("/")
Call<ResponseBody> getIpAddress(@Query("ip")String ip);
}
そして、あなたは、APIのプロキシを返すように動的プロキシを使用してオブジェクトを作成し、レトロフィットやAPIを作成するためのすべての要求をしないで次のように、要求することができます。ホストアドレスbaseUrlには、値@ GET、@ポスト等時性要求をスプライスする時期改修工事へは示しています。
private void doRetrofit(String u) {
OkHttpClient okHttpClient = new OkHttpClient();
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http://ip.tianqiapi.com/")
.build();
Apis apis = retrofit.create(Apis.class);
apis.getIpAddress("39.156.66.18").enqueue(new retrofit2.Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
try {
Log.i(TAG, "onResponse: " + response.body().string());
} catch (IOException e) {
}
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
}
多くのもノート:
要求モード注:GET、POST、PUT、DELETE 、PATCH、HEAD、OPTIONS、HTTP
マーク・ノート:FormUrlEncoded、マルチパート、ストリーミング
パラメータの型注釈を:ヘッダ、ヘッダ、ボディ、フィールド 、のFieldMap、パート、PartMap、 クエリ、QueryMap、パス
これらのアノテーションとは、ファイルのアップロードを完了することができ、ポストは、JSONや他の要求を提出しました。
彼によって文字列JSONにオブジェクトを変換することができ、より実用的なコンバータです。何のコンバータがない場合、戻り値は常にResponseBodyでなければなりません。
依存、内部com.google.gsonプロセスをご紹介します。
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
IPアドレス。
public class IpAddress {
private String ip;
private String country;
private String province;
private String city;
private String isp;
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getIsp() {
return isp;
}
public void setIsp(String isp) {
this.isp = isp;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
@Override
public String toString() {
return "IpAddress{" +
"ip='" + ip + '\'' +
", country='" + country + '\'' +
", province='" + province + '\'' +
", city='" + city + '\'' +
", isp='" + isp + '\'' +
'}';
}
}
戻り値を変更します。
public interface Apis {
@GET("/")
Call<IpAddress> getIpAddress(@Query("ip")String ip);
}
private void doRetrofit(String u) {
OkHttpClient okHttpClient = new OkHttpClient();
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl(u)
.addConverterFactory(GsonConverterFactory.create())
.build();
Apis apis = retrofit.create(Apis.class);
apis.getIpAddress("39.156.66.18").enqueue(new retrofit2.Callback<IpAddress>() {
@Override
public void onResponse(retrofit2.Call<IpAddress> call, retrofit2.Response<IpAddress> response) {
Log.i(TAG, "onResponse: " + response.body().toString());
}
@Override
public void onFailure(retrofit2.Call<IpAddress> call, Throwable t) {
t.printStackTrace();
}
});
}
出力は非常に便利な次の