Android开发 -- Retrofit + Rxjava + Kotlin => Request API

博客介绍了使用Retrofit、Rxjava基于Kotlin配置网络请求端口,通过Wiki百科搜索接口获取搜索词条相关数目。包括引用库、创建服务接口、管理变量、创建数据索引对象等步骤。还指出分线程无法改变UI,创建接口服务可在interface或Activity中进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

使用Retrofit 和 Rxjava以及基于kotlin配置网络请求端口,并使用Wiki百科的搜索接口获得搜索词条相关数目:https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=li%20zhaojia

步骤

  1. 引用库:
    //Retrofit
    implementation "com.squareup.retrofit2:retrofit:2.4.0"
    //Gson converter
    implementation "com.squareup.retrofit2:converter-gson:2.3.0"
    //String
    implementation "com.squareup.retrofit2:converter-scalars:2.3.0"
    //okhttp
    implementation "com.squareup.okhttp3:okhttp:3.10.0"
    implementation "com.squareup.okhttp3:logging-interceptor:3.8.0"
    //Rxjava
    implementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0"
    //Rxjava2
    implementation "io.reactivex.rxjava2:rxandroid:2.0.2"
    implementation "io.reactivex.rxjava2:rxjava:2.1.9"
复制代码
  1. 创建服务接口
interface WikiApiService{
    @GET("api.php")
    fun hitCountCheck(@QueryMap options:Map<String,String>):Observable<Model.Result>
    //an Observable, which is a Rxjava object that could analog as the endpoint fetcher result generator.
    companion object{
        fun create() :WikiApiService{
            val retrofit = Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl("https://en.wikipedia.org/w/")
                .build()
            return retrofit.create(WikiApiService::class.java)
        }
    }
}
复制代码

由于需要query的变量有些多,所以使用QueryMap来统一管理变量,在activity中定义HashMap。其中Observable返回的是一个object,是我们自己定义的获取数据类,因为我们想获取类似这种数据:

{
 batchcomplete: "",
 continue: {
  sroffset: 10,
  continue: "-||"
 },
 query: {
  searchinfo: {
   totalhits: 16776   //target data
 },
 search: [...
复制代码
  1. 创建数据索引对象

其中totalhits是我们想获取的数据,我们需要results -> query -> searchinfo -> totalhits ,所以我们需要创建一个新的object来存放数据索引:

object Model {
    data class Result(val query: Query)
    data class Query(val searchinfo: SearchInfo)
    data class SearchInfo(val totalhits: Int)
}
复制代码
  1. 在Activity中使用懒加载来创建observable实例并创建可取消的disposable:
private var disposable: Disposable? = null   // disposable is a cancelable object
private val wikiApiServe by lazy {
    WikiApiService.create()
}
复制代码

然后创建功能函数:

@SuppressLint("SetTextI18n")
private fun beginSearch(srsearch : String){
    val options = HashMap<String,String>()
    options["action"] = "query"
    options["format"] = "json"
    options["list"] = "search"
    options["srsearch"] = srsearch
    //Scheduler: Thread control
    disposable = wikiApiServe.hitCountCheck(options)
        .subscribeOn(Schedulers.io())  //subscribeOn(): choose a Thread to produce  I/O scheduler:(read&write data、read&write db、change info on the Internet)
        .observeOn(AndroidSchedulers.mainThread())  //observeOn(): choose a Thread to spend  AndroidSchedulers.mainThread(),on Android UI(main Thread)
        .subscribe(
            { result -> show_result.text = "${result.query.searchinfo.totalhits} results found"},
            { error -> Toast.makeText(this, error.message, Toast.LENGTH_LONG).show()}
        )
}
复制代码

在需要获取的edit text中使用这个功能函数就可以获得该搜索词条在wiki百科中的数目。

get_result.setOnClickListener {
    val text = edit_text.text.toString()
    if (edit_text.text.toString().isNotEmpty()){
        Toast.makeText(this, edit_text.text.toString(), Toast.LENGTH_LONG).show()
        beginSearch(text)
    }
}
复制代码

总结

在分线程中无法改变UI,也就是说必须在UI线程(AndroidSchedulers.MainThrea())中才能改变UI布局。

创建接口服务的方法可以在interface中创建,也可以在Activity中创建,在interface中需要使用companion object,然后在Activity中实例化。

转载于:https://juejin.im/post/5ce2a032f265da1bb564cb00

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值