Android开发之Retrofit小试牛刀
感覺(jué)好久沒(méi)有寫Android的文章了,囧囧囧!因?yàn)镽etrofit實(shí)在是太火了, 火得我一直躍躍欲試,但是由于種種原因吧,一直都沒(méi)有用過(guò)。周末閑來(lái)無(wú)事,利用一個(gè)以前開(kāi)發(fā)中用過(guò)的服務(wù)器API來(lái)小試牛刀一下,非常簡(jiǎn)單,記錄自己的第一次Retrofit之旅。
重要說(shuō)明:由于涉及到商業(yè)機(jī)密,所以對(duì)請(qǐng)求的數(shù)據(jù)和服務(wù)器地址進(jìn)行了處理。自己實(shí)驗(yàn)時(shí),請(qǐng)換成自己的服務(wù)器。
一、添加依賴、配置項(xiàng)目
這一步就不詳細(xì)說(shuō)了,會(huì)的都會(huì),基本就是添加兩個(gè)依賴和網(wǎng)絡(luò)訪問(wèn)權(quán)限。
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0'<uses-permission android:name="android.permission.INTERNET" /> 復(fù)制代碼二、根據(jù)服務(wù)器端返回的JSON數(shù)據(jù)配置自己的JavaBean
在項(xiàng)目中用Retrofit的時(shí)候,肯定和服務(wù)器端的哥們商量好了如何交互,也就是說(shuō)已經(jīng)知曉了服務(wù)器端會(huì)返回什么樣的數(shù)據(jù)(基本都是JSON,只是內(nèi)容不一樣而已),這些數(shù)據(jù)你可以直接用字符串接收,然后自己處理,但是這么low的事情,Retrofit肯定可以幫我處理了,用上面的converter-gson就可以自動(dòng)將JSON轉(zhuǎn)成我們的對(duì)象,前提是需要與返回的JSON字段進(jìn)行映射,默認(rèn)情況下字段名一樣就不會(huì)出什么問(wèn)題,但是我卻踩了一個(gè)坑,下文會(huì)介紹。
- 服務(wù)器端返回的JSON數(shù)據(jù)如下:
- 根據(jù)上面的JSON數(shù)據(jù)創(chuàng)建JavaBean
踩坑記錄:服務(wù)器端居然有一個(gè)abstract字段,但是這個(gè)是Java關(guān)鍵字啊,怎么辦?用@SerializedName告訴Retrofit,我想你把該字段映射成我自定義的名字。
配置訪問(wèn)服務(wù)器API的接口
這個(gè)就是真正的訪問(wèn)服務(wù)器的本地API了,我這里只用了GET,其實(shí)遠(yuǎn)不止這個(gè)功能,可以參考官方文檔。
import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Query;/*** Created by yangfan on 2017/1/7.*/ public interface NewsInterface {//獲取服務(wù)器的新聞列表,由于新聞?lì)愋秃头猪?yè)顯示的需要,需要傳遞三個(gè)參數(shù)@GET("news/list")Call<NewsInfo> newsList(@Query("type") String type, @Query("pn") String pn, @Query("ps") String ps);} 復(fù)制代碼Activity
配置好以上信息以后,就可以開(kāi)始寫Android的程序了。因?yàn)槲业某绦虮容^簡(jiǎn)單,所以我很快就成功獲取數(shù)據(jù)了,這一塊沒(méi)怎么踩坑。
public class MainActivity extends AppCompatActivity {private TextView tvResult;//服務(wù)器的基地址 與 @GET("news/list")拼接private static final String baseUrl = "http://服務(wù)器地址/";@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) {//將返回的數(shù)據(jù)轉(zhuǎn)換成自定義的對(duì)象NewsInfo newsInfo = response.body();if(newsInfo.getMessage().equals("ok")){//最爽的地方---直接可以進(jìn)行UI操作tvResult.setText(newsInfo.getList().get(0).get_abstract());}} else {//請(qǐng)求失敗tvResult.setText("查詢失敗!響應(yīng)碼為:" + response.code());}}@Overridepublic void onFailure(Call<NewsInfo> call, Throwable t) {//請(qǐng)求失敗t.printStackTrace();tvResult.setText("查詢失敗!錯(cuò)誤原因:" + t.getCause());}});} }復(fù)制代碼運(yùn)行結(jié)果
Retrofit功能非常強(qiáng)大,我也看了很多文檔,上面用的只是冰山一角。目前感覺(jué)最大的好處就是可以直接在回調(diào)中操作主線程的UI,再也不需要用Handler了,其他牛逼的功能和好處待學(xué)習(xí)、待發(fā)掘。
轉(zhuǎn)載于:https://juejin.im/post/5a3113875188257df8462c9a
總結(jié)
以上是生活随笔為你收集整理的Android开发之Retrofit小试牛刀的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【html、css、jq】制作一个简洁的
- 下一篇: Android鬼点子 CirclePro