Appはあなたを連れてRetrofit 2を学びます.0、麻麻はもう私のネットの要求を心配する必要はありません!

5936 ワード

Retrofit、Retrofit、Retrofit、ますます多くの人がこのネットリクエストフレームワークを游んでいます.このsquareup社がオープンソースのネットリクエストフレームワークは确かに使いやすいです.今日はこの東東がどうやって游ぶかを見てみましょう.
Retrofitは簡略化されたHTTPリクエストライブラリとして長い間使われていましたが、初期のバージョンでは特に爽やかではないところもあり、Retrofitは2.0から多くの前の痛みを修正し、今ではよりよく使われているだけでなく、機能もより強くなっています.Retrofitでは、インタフェース、メソッド、注釈パラメータなどを使用して、リクエストがどのように作成されるかを定義することを宣言できます.また、RESTスタイルのリクエストをサポートするとともに、スレッドの非同期アクセスの問題、RxJavaなどをサポートすることも鮮明です.さあ、くだらないことは言わないで、まず今日実現する効果図を見てみましょう.
このような簡単なリストを作って、Retrofitを使用して実現する方法を見てみましょう.OK、ここでは主に以下の4つのステップでRetrofitを使用します.
1.ガイドパッケージ
2.APIインタフェースの定義
3.初期化Retrofit
4.ネットワークリクエストの開始

1.ガイドパッケージ


Retrofitを使用するには、まずガイドパッケージに違いありません.ここで2つのパッケージを導入します.以下のようにします.
compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

1つのパッケージはRetrofitのパッケージで、もう1つはJson変換のツールパッケージです(具体的な役割は第3節を参照).

2.APIインタフェースの定義


次に、Retrofit 2に関連するネットワーク要求インタフェースを定義する.0では、APIServiceの定義も非常に簡単なことになります.例えば、私が定義したAPIServiceは次のようになります.
public interface ApiService {

    // TabLayout 
    @GET("api/lore/classify")
    Call getClassfyData();
    
    // 
    @GET("api/lore/list")
    Call getListData(@Query("id") int id);

    // 
    @GET("api/lore/show")
    Call getDetailData(@Query("id") int id);
}

@GETは、要求がget要求であることを示し、また@POSTは、要求がPOST要求であることを示す@POSTは、一般的である.@GETの後のパラメータは要求の経路を表すがドメイン名を含まない.第一の方法はTabLayout上のデータを取得するためであり、このインタフェースはパラメータを必要とせず、第二の第三の方法はデータを要求する際にパラメータを伝達する必要があるため、この方法にはパラメータがあり、@Query("id")はこのパラメータ名がidであることを表す.2つ目の方法を例にとると、パラメータ付きリクエストは実際にはapi/lore/list?id=idであり、ここで注意しなければならないのは、getリクエストに適用され、POSTリクエストは@FormUrlEncoded注記を追加し、フォームでパラメータをコミットすることを示す必要があることです.栗を挙げます.
@FormUrlEncoded
    @POST("api/lore/list")
    Call getListData(@Field("id") int id);

Callリクエストは、リクエストの戻りオブジェクトを表す汎用パラメータを受信します.Retrofitは、戻り値を受信した後、私たちが渡したオブジェクト変換ファクトリメソッドに従って戻り値をオブジェクトに変換します.

3.初期化Retrofit


APIServiceを定義したら、次のようにしてRetrofitを初期化できます.Retrofitの初期化は簡単です.
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.tngou.net/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

baseUrlは実は私たちがアドレスを要求するドメイン名で、このドメイン名は上記のAPIServiceのパラメータに合わせて完全な要求パスです.addConverterFactoryは、変換ファクトリを追加することを示しています.ここで要求したデータはJSONデータなので、GsonConverterFactoryを追加します.create()は、受信したJsonデータをDAOに変換することを示しています.公式に提供されている変換工場には、私たちが使っているもののほかに、次のようなものがあります.
Gson: com.squareup.retrofit:converter-gson
Jackson: com.squareup.retrofit:converter-jackson
Moshi: com.squareup.retrofit:converter-moshi
Protobuf: com.squareup.retrofit:converter-protobuf
Wire: com.squareup.retrofit:converter-wire
Simple XML: com.squareup.retrofit:converter-simplexml
使用する必要がある場合は、対応するパッケージを追加すればよい.
OK、これは最も基本的な構成で、RetrofitのネットワークリクエストはOKHttpを使用していますが、私たちのところにはどうして構成されていませんか?構成しない場合は、OKHttpオブジェクトがデフォルトで作成されます.構成しても問題ありません.構成方法は次のとおりです.
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(5, TimeUnit.SECONDS)
                .readTimeout(10,TimeUnit.SECONDS)
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.tngou.net/")
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();

4.ネットワークリクエストの開始


上記の手順を完了すると、次のようなネットワークリクエストを開始できます.
        ApiService apiService = retrofit.create(ApiService.class);
        Call call = apiService.getClassfyData();
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                ClassfyBean body = response.body();
                List fragments = new ArrayList();
                for (int i = 0; i < body.getTngou().size(); i++) {
                    fragments.add(BaseFragment.getInstance(body.getTngou().get(i).getId()));
                }
                VpAdapter adapter = new VpAdapter(getSupportFragmentManager(), fragments, body);
                viewPager.setAdapter(adapter);
                tabLayout.setupWithViewPager(viewPager);
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                Log.d("google_lenve", "onFailure: "+t.getMessage());
            }
        });

ここではまずretrofit.createメソッドはAPIServiceインスタンスを取得し、そのインスタンスの対応するデータ取得メソッドを呼び出し、1つのcallを取得します.callを取得した後、私たちは2つの選択(OKHttpのcallに似ています)を持っています.1つはcallのexecute()メソッドを呼び出してResponseオブジェクトを取得します.コードは次のとおりです.
Response execute = call.execute();

しかし、この方法はスレッドをブロックします.Androidでこの方法を呼び出すには、この行のコードをサブスレッドに配置して実行する必要があります.これは、コードの量を増やすに違いありません.したがって、推奨される方法はcallのenqueueメソッドを呼び出すことです.これは非同期リクエストです.OKHttpのenqueueと似ています.違いは、ここの2つのコールバックメソッドonResponseとonFailureがメインスレッドで実行されていることです.つまり、この2つのコールバックメソッドでUIを直接更新できることを意味します.爽やかでしょう.

5.その他


以上の知識点はすでに私たちのニーズを実現することができますが、Retrofitと言った以上、他の機能点について話しましょう.
Retrofitには@Pathという注記があります.URLアドレスを表すプレースホルダです.使用方法は次のとおりです.
@GET("api/{id}/delete")
    Call getData(@Path("id")String id);

追加要求ヘッダ情報を示す注記@Headerもあります.他にも注釈がたくさんありますが、少ないので、ここでは紹介しません.
OK、この紹介はここまでですが、後でRetrofitがRxJavaに合わせて使用している問題についてお話しします.
以上...
記事の最初の項目アドレス:https://github.com/lenve/Retrofit
転載先:https://www.cnblogs.com/lenve/p/5865887.html