Android开发之Retrofit小试牛刀
感覺好久沒有寫Android的文章了,囧囧囧!因為Retrofit實在是太火了, 火得我一直躍躍欲試,但是由于種種原因吧,一直都沒有用過。周末閑來無事,利用一個以前開發中用過的服務器API來小試牛刀一下,非常簡單,記錄自己的第一次Retrofit之旅。
重要說明:由于涉及到商業機密,所以對請求的數據和服務器地址進行了處理。自己實驗時,請換成自己的服務器。
一、添加依賴、配置項目
這一步就不詳細說了,會的都會,基本就是添加兩個依賴和網絡訪問權限。
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0'<uses-permission android:name="android.permission.INTERNET" /> 復制代碼二、根據服務器端返回的JSON數據配置自己的JavaBean
在項目中用Retrofit的時候,肯定和服務器端的哥們商量好了如何交互,也就是說已經知曉了服務器端會返回什么樣的數據(基本都是JSON,只是內容不一樣而已),這些數據你可以直接用字符串接收,然后自己處理,但是這么low的事情,Retrofit肯定可以幫我處理了,用上面的converter-gson就可以自動將JSON轉成我們的對象,前提是需要與返回的JSON字段進行映射,默認情況下字段名一樣就不會出什么問題,但是我卻踩了一個坑,下文會介紹。
- 服務器端返回的JSON數據如下:
- 根據上面的JSON數據創建JavaBean
踩坑記錄:服務器端居然有一個abstract字段,但是這個是Java關鍵字啊,怎么辦?用@SerializedName告訴Retrofit,我想你把該字段映射成我自定義的名字。
配置訪問服務器API的接口
這個就是真正的訪問服務器的本地API了,我這里只用了GET,其實遠不止這個功能,可以參考官方文檔。
import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Query;/*** Created by yangfan on 2017/1/7.*/ public interface NewsInterface {//獲取服務器的新聞列表,由于新聞類型和分頁顯示的需要,需要傳遞三個參數@GET("news/list")Call<NewsInfo> newsList(@Query("type") String type, @Query("pn") String pn, @Query("ps") String ps);} 復制代碼Activity
配置好以上信息以后,就可以開始寫Android的程序了。因為我的程序比較簡單,所以我很快就成功獲取數據了,這一塊沒怎么踩坑。
public class MainActivity extends AppCompatActivity {private TextView tvResult;//服務器的基地址 與 @GET("news/list")拼接private static final String baseUrl = "http://服務器地址/";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvResult = (TextView) findViewById(R.id.tvResult);initRetrofit();}private void initRetrofit() {Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(GsonConverterFactory.create()).build();NewsInterface newsInterface = retrofit.create(NewsInterface.class);Call<NewsInfo> callNewsInfo = newsInterface.newsList("1", "1", "10");callNewsInfo.enqueue(new Callback<NewsInfo>() {@Overridepublic void onResponse(Call<NewsInfo> call, Response<NewsInfo> response) {//成功if (response.code() == 200) {//將返回的數據轉換成自定義的對象NewsInfo newsInfo = response.body();if(newsInfo.getMessage().equals("ok")){//最爽的地方---直接可以進行UI操作tvResult.setText(newsInfo.getList().get(0).get_abstract());}} else {//請求失敗tvResult.setText("查詢失敗!響應碼為:" + response.code());}}@Overridepublic void onFailure(Call<NewsInfo> call, Throwable t) {//請求失敗t.printStackTrace();tvResult.setText("查詢失敗!錯誤原因:" + t.getCause());}});} }復制代碼運行結果
Retrofit功能非常強大,我也看了很多文檔,上面用的只是冰山一角。目前感覺最大的好處就是可以直接在回調中操作主線程的UI,再也不需要用Handler了,其他牛逼的功能和好處待學習、待發掘。
轉載于:https://juejin.im/post/5a3113875188257df8462c9a
總結
以上是生活随笔為你收集整理的Android开发之Retrofit小试牛刀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【html、css、jq】制作一个简洁的
- 下一篇: 使用ASIFormDataRequest