前面我已經把現在最為流行三個網路框架的其中兩個volley和Okhttp3擼了一遍,接下來我就把最後的一個Retrofit2也擼一下。最近也搞了一下Android SDK開發的事,發現網上對於Android SDK開發的資料真的很少。到時我會把這個框架的功能整合到一個Jar包上,做一個簡單的SDK開發來讓大家也瞭解一下。
我們先來了解一下Retrofit2這個網路框架,準確來說Retrofit是基於Okhttp3的官方封裝一個網路框架。所以這個框架的使用跟Okhttp3非常的相似,如果你在此之前有看過我前面的OKhttp3的教程或者其他人的教程的話,接下來的內容你就會更加的容易瞭解。
由於最近更新了Androidstudio4.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類的原始碼粘貼出來了。在官方文件中還有很多的提交形式,有興趣的可以去了解一下。我這裡算了拋磚引玉,如果有什麼錯誤的地方歡迎各位提出來一個探討。