1. 程式人生 > >Retrofit2.0入門教程

Retrofit2.0入門教程

Retrofit的官方文件前面我已經把現在最為流行三個網路框架的其中兩個volley和Okhttp3擼了一遍,接下來我就把最後的一個Retrofit2也擼一下。最近也搞了一下Android SDK開發的事,發現網上對於Android SDK開發的資料真的很少。到時我會把這個框架的功能整合到一個Jar包上,做一個簡單的SDK開發來讓大家也瞭解一下。

我們先來了解一下Retrofit2這個網路框架,準確來說Retrofit是基於Okhttp3的官方封裝一個網路框架。所以這個框架的使用跟Okhttp3非常的相似,如果你在此之前又看過我前面的OKhttp3的教程或者其他人的教程的話,接下來的內容你就會更加的容易瞭解。

由於最近更新了Androidstudio3.0,便用這個編譯環境來試水啦,不過使用原理都是一樣的。首先我們先建立一個名為RetrofitDemo的專案,然後在app的gradle下新增Retrofit的依賴包。如下:

  implementation 'com.squareup.retrofit2:retrofit:2.4.0'

然後我們嘗試做這樣一個功能,當我們點選一個GET按鈕時就向服務端傳送一個GET請求,然後我們把返回來的結果通過吐司展示出來。當我們點選一個POST按鈕就向服務端傳送一個POST請求,也把返回來的結果吐司展現。XML佈局如下:

<Button
       android:layout_margin="10dp"
       android:id="@+id/btn_login_get"
       android:text="GET登入"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />
   <Button
       android:layout_margin="10dp"
       android:id="@+id/btn_login_post"
       android:text="POST登入"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

接下來我們建立一個名為Api的介面,這是根據Retrofit的官方文件的格式來定義。介面程式碼如下:

public interface Api {

    @GET("寫上你要訪問的地址")//GET請求註釋
    Call<ResponseBody> getUserInfo();

    @POST("寫上你要訪問的地址")//POST請求註釋
    Call<User> postSubmit (@Body User user);

}

主函式裡,因為我們的POST請求是以JSON的格式來返回資料的,所以我們要先在app.gradle裡新增GSON依賴,程式碼如下:

 implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

接下來我們分別為兩個按鈕新增點選事件,並呼叫剛才定義介面的GET和POST方法來驗證是否能夠正常訪問我們需要訪問的地址,並進行吐司,最後還要在AndroidManifest裡面註冊網路許可權。主函式程式碼如下:

  private Button btn_login_get,btn_login_post;
    private  Api api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_login_get = findViewById(R.id.btn_login_get);
        btn_login_post = findViewById(R.id.btn_login_post);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("寫上你要訪問的基地址如:http://127.0.0.1:8080/")
                .addConverterFactory(GsonConverterFactory.create())//通過Gson的格式來解析資料
                .build();
        api = retrofit.create(Api.class);

        btn_login_post.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                User user = new User();
                user.setMoyo_sdk_name("admin");
                user.setMoyo_sdk_pwd("123456");
                api.postSubmit(user).enqueue(new Callback<User>() {//呼叫了我們在介面上定義的POST方法postSubmit(請求型別) Callback(返回型別)
                    @Override
                    public void onResponse(Call<User> call, Response<User> response) {

                        String name = response.body().getMoyo_sdk_name();
                        String password = response.body().getMoyo_sdk_pwd();
                        int code = response.body().getCode();

                        Toast.makeText(MainActivity.this,"name:"+name+"password:"+password+"code:"+code,Toast.LENGTH_LONG).show();

                    }

                    @Override
                    public void onFailure(Call<User> call, Throwable t) {

                    }
                });
            }
        });

        btn_login_get.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //此部分為不簡寫,適合新手檢視原理
//                Call<ResponseBody> call = api.getUserInfo();
//
//                call.enqueue(new Callback<ResponseBody>() {
//                    @Override
//                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//
//                        try {
//                            String msg = response.body().string();
//                            Toast.makeText(MainActivity.this,msg,Toast.LENGTH_LONG).show();
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        }
//                    }
//
//                    @Override
//                    public void onFailure(Call<ResponseBody> call, Throwable t) {
//
//                    }
//                });
//

                api.getUserInfo().enqueue(new Callback<ResponseBody>() {//呼叫了介面上的GET方法getUserInfo()
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                        try {
                            String result = response.body().string();
                            Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }

                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {

                    }
                });


            }
        });

    }

在我們處理資料的時候我們可以選擇建立一些Bean類,因為每個人請求的後臺所得到的資料都不一樣我就不把我的Bean類的原始碼粘貼出來了。在官方文件中還有很多的提交形式,有興趣的可以去了解一下。我這裡算了拋磚引玉,如果有什麼錯誤的地方歡迎各位提出來一個探討。