最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Retrofit框架的使用

 更新時間:2021年03月25日 11:08:41   作者:浮沉一生  
這篇文章主要介紹了Android Retrofit框架的使用,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下

Retrofit介紹

Retrofit是Square開源的一款基于OkHttp(也是他家的)封裝的網(wǎng)絡(luò)請求框架,主要的網(wǎng)絡(luò)請求還是OkHttp來完成,Retrofit只是對OkHttp進行了封裝,可以讓我們更加簡單方便的使用,目前大部分公司都在使用這款框架,Retrofit的原理也是面試必問的問題之一了,所以我們不僅要會使用,也要對其實現(xiàn)原理有一個大概的了解。

本片文章從使用角度來說,不對的地方希望大家在評論區(qū)交流,我會及時改進,共同進步,文章中的demo可以從github下載。

Retrofit優(yōu)點

Retrofit的大部分配置是通過注解來實現(xiàn)的,配置簡單,使用方便;支持多種返回類型包括RxJava和協(xié)程,可以配置不同的解析器來進行數(shù)據(jù)解析,如Json,xml等

Retrofit的使用

以下代碼全部為Kotlin語言編寫,畢竟現(xiàn)在Kotlin也是大勢所趨了。

1.引入依賴項

github地址:github.com/square/retr…

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//支持Gson解析json數(shù)據(jù)
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
//支持RxJava返回類型
implementation "com.squareup.retrofit2:adapter-rxjava2:2.9.0"
implementation "io.reactivex.rxjava2:rxandroid:2.0.2"
//支持協(xié)程,Retrofit2.6.0及以上版本不需要引入,Retrofit內(nèi)置已經(jīng)支持
//implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'

2.添加網(wǎng)絡(luò)權(quán)限

<uses-permission android:name="android.permission.INTERNET"/>

3.編寫Retrofit輔助類

首先定義一個RetrofitHelper輔助類,編寫Retrofit單例,Retrofit內(nèi)部已經(jīng)維護了線程池做網(wǎng)絡(luò)請求,不需要創(chuàng)建多個

注:BASE_URL必須為 "/" 結(jié)尾

object RetrofitHelper {
 
 //baseUrl根據(jù)自己項目修改
 private const val BASE_URL = "https://www.baidu.com"

 private var retrofit: Retrofit? = null

 private var retrofitBuilder: Retrofit.Builder? = null
 
 //Retrofit初始化
 fun init(){
  if (retrofitBuilder == null) {
   val client = OkHttpClient.Builder()
    .connectTimeout(20, TimeUnit.SECONDS)
    .readTimeout(20, TimeUnit.SECONDS)
    .writeTimeout(20, TimeUnit.SECONDS)
    .build()
   retrofitBuilder = Retrofit.Builder()
    .baseUrl(BASE_URL)
    //支持Json數(shù)據(jù)解析
    .addConverterFactory(GsonConverterFactory.create())
    //支持RxJava返回類型
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .client(client)
  }
  retrofit = retrofitBuilder!!.build()
 }

 fun getRetrofit():Retrofit{
  if (retrofit == null) {
   throw IllegalAccessException("Retrofit is not initialized!")
  }
  return retrofit!!
 }

}

然后再Application中進行初始化

class App:Application() {

 override fun onCreate() {
  super.onCreate()
  RetrofitHelper.init()
 }
}

在Manifest文件中指定Application

<application
 android:name=".App"
 android:allowBackup="true"
 android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name"
 android:roundIcon="@mipmap/ic_launcher_round"
 android:supportsRtl="true"
 android:networkSecurityConfig="@xml/network_security_config"
 android:theme="@style/Theme.RetrofitDemo">
 <activity android:name=".MainActivity">
  <intent-filter>
   <action android:name="android.intent.action.MAIN" />

   <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </activity>
</application>

Android P系統(tǒng)限制了明文流量的網(wǎng)絡(luò)請求 解決的辦法有2種 1.把所有的http請求全部改為https請求 2.在res的xml目錄(),然后創(chuàng)建一個名為:network_security_config.xml文件

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

4.定義ApiService

首先我們先用一個最簡單的GET請求來試一下,這個接口是請求天氣情況的,免費的

interface Api {
 @GET("http://www.weather.com.cn/data/sk/{cityCode}.html")
 fun getWeather(@Path("cityCode")code:String):Observable<WeatherInfo>
}

定義返回類型,為了方便打印,用的data class 類型

data class WeatherInfo(
 var weatherinfo:Info?=null) {
  
 data class Info(
  var city:String?,
  var cityid:String?,
  var temp:String?,
  var WD:String?,
  var WS:String?,
  var SD:String?,
  var AP:String?,
  var njd:String?,
  var WSE:String?,
  var time:String?)
}

首先用@GET注解表示該借口為get請求,GET注解的value為請求地址,完整的請求地址為baseUrl+value,如value為完整地址,則會使用value為請求地址,一般通用情況下baseUrl = "www.weather.com.cn/", 然后GET("data/sk/{cityCode}.html") @Path是網(wǎng)址中的參數(shù),用來替換。

5.實現(xiàn)接口方法

5.1RxJava方法實現(xiàn)

class RetrofitViewModel:ViewModel() {

 private val disposables:CompositeDisposable by lazy {
  CompositeDisposable()
 }

 fun addDisposable(d:Disposable){
  disposables.add(d)
 }

 val weatherLiveData = MutableLiveData<WeatherInfo>()

 fun getWeather(){
  RetrofitHelper.getRetrofit().create(Api::class.java).getWeather("101010100")
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(object :Observer<WeatherInfo>{
    override fun onComplete() {}

    override fun onSubscribe(d: Disposable) {
     addDisposable(d)
    }

    override fun onNext(t: WeatherInfo) {
     weatherLiveData.value = t
    }

    override fun onError(e: Throwable) {

    }
   })
 }

 override fun onCleared() {
  super.onCleared()
  disposables.clear()
 }

}

這里是用ViewModel中做的操作,如果是MVP模式放在Presenter中進行就好,首先通過Retrofit單例調(diào)用Service的對象的getWeather方法,指定上下游事件的線程,創(chuàng)建觀察者對象進行監(jiān)聽,在onNext方法中拿到返回結(jié)果后回調(diào)給Activity,數(shù)據(jù)回調(diào)用的是LiveData,在Activity中操作如下

class MainActivity : AppCompatActivity() {
 
 private val viewModel by viewModels<RetrofitViewModel>()

 private var btnWeather: Button? = null

 private var tvWeather: TextView? = null

 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
  viewModel.weatherLiveData.observe(this, Observer {
   tvWeather?.text = it.toString())
  })
  btnWeather = findViewById<Button>(R.id.btnWeather)
  tvWeather = findViewById(R.id.tvWeather)
  btnWeather?.setOnClickListener {
   viewModel.getWeather()
  }
 }
}

在Activity中

1.創(chuàng)建ViewModel對象

2.注冊LiveData的回調(diào)

3.獲取天氣情況

如下圖所示

github地址:github.com/ZhiLiangT/R…

以上就是Android Retrofit框架的使用的詳細內(nèi)容,更多關(guān)于Android Retrofit框架的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android布局技巧之include、merge與ViewStub標簽的巧用

    Android布局技巧之include、merge與ViewStub標簽的巧用

    Android 官方提供了三個用來優(yōu)化布局的標簽,分別是include、merge與ViewStub,下面這篇文章主要給大家介紹了關(guān)于Android布局技巧之include、merge與ViewStub標簽巧用的相關(guān)資料,需要的朋友可以參考下
    2018-06-06
  • Android?ViewBinding使用介紹

    Android?ViewBinding使用介紹

    最近這段時間在學習Kotlin,突然發(fā)現(xiàn)谷歌已經(jīng)把kotlin-android-extensions插件廢棄,目前推薦使用ViewBinding來進行替代,接下來通過本文給大家分享Android使用ViewBinding的詳細步驟,感興趣的朋友一起學習吧
    2022-09-09
  • Android屬性動畫實現(xiàn)炫酷的登錄界面

    Android屬性動畫實現(xiàn)炫酷的登錄界面

    這篇文章主要為大家詳細介紹了Android屬性動畫實現(xiàn)炫酷的登錄界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android編程實現(xiàn)動態(tài)支持多語言的方法

    Android編程實現(xiàn)動態(tài)支持多語言的方法

    這篇文章主要介紹了Android編程實現(xiàn)動態(tài)支持多語言的方法,涉及Android資源、控件及屬性相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • Android Canvas和Bitmap結(jié)合繪圖詳解流程

    Android Canvas和Bitmap結(jié)合繪圖詳解流程

    在 Android Canvas 上繪圖非常難,在繪圖時需要理解許多不同的類和概念。這篇文章中,將介紹 Android 框架中可用的一些類,它們可以讓畫布使用時更輕松
    2021-11-11
  • android開發(fā)實現(xiàn)列表控件滾動位置精確保存和恢復的方法(推薦)

    android開發(fā)實現(xiàn)列表控件滾動位置精確保存和恢復的方法(推薦)

    下面小編就為大家?guī)硪黄猘ndroid開發(fā)實現(xiàn)列表控件滾動位置精確保存和恢復的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 理解關(guān)于Android系統(tǒng)中輕量級指針的實現(xiàn)

    理解關(guān)于Android系統(tǒng)中輕量級指針的實現(xiàn)

    由于android系統(tǒng)底層的很大的一部分是用C++實現(xiàn)的,C++的開發(fā)就難免會使用到指針的這個知識 點。而C++的難點和容易出問題的也在于指針。使用指針出錯,常常會引發(fā)帶來對項目具有毀滅性的錯誤,內(nèi)存泄漏、邏輯錯誤、系統(tǒng)崩潰
    2021-10-10
  • Input系統(tǒng)之InputReader處理按鍵事件詳解

    Input系統(tǒng)之InputReader處理按鍵事件詳解

    這篇文章主要為大家介紹了Input系統(tǒng)之InputReader處理按鍵事件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Android中的dumpsys命令詳解

    Android中的dumpsys命令詳解

    本文詳細講解了Android中的dumpsys命令,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • Android OKHttp框架的分發(fā)器與攔截器源碼刨析

    Android OKHttp框架的分發(fā)器與攔截器源碼刨析

    okhttp是一個第三方類庫,用于android中請求網(wǎng)絡(luò)。這是一個開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient
    2022-11-11

最新評論

柘城县| 大宁县| 丰顺县| 博兴县| 嘉兴市| 忻州市| 枣强县| 德江县| 紫阳县| 晋宁县| 桦川县| 黑水县| 滦平县| 临夏市| 古蔺县| 玉屏| 开江县| 沂源县| 文安县| 车险| 若尔盖县| 新津县| 上高县| 平陆县| 永胜县| 东城区| 巴林左旗| 延边| 磐石市| 茶陵县| 玉树县| 通渭县| 贞丰县| 高雄县| 桃园县| 屏东县| 霍林郭勒市| 阿克陶县| 濮阳市| 宣恩县| 武夷山市|