摘要:前言使用和以及基于配置网络请求端口,并使用百科的搜索接口获得搜索词条相关数目步骤引用库创建服务接口由于需要的变量有些多,所以使用来统一管理变量,在中定义。总结在分线程中无法改变,也就是说必须在线程中才能改变布局。
前言使用Retrofit 和 Rxjava以及基于kotlin配置网络请求端口,并使用Wiki百科的搜索接口获得搜索词条相关数目:https://en.wikipedia.org/w/api.php);
步骤引用库:
//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"
创建服务接口
interface WikiApiService{
@GET("api.php")
fun hitCountCheck(@QueryMap options:Map<String,String>):Observable
//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: [...
创建数据索引对象
其中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)
}
在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()
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://www.ucloud.cn/yun/7043.html
摘要:让你收获满满码个蛋从年月日推送第篇文章一年过去了已累积推文近篇文章,本文为年度精选,共计篇,按照类别整理便于读者主题阅读。本篇文章是今年的最后一篇技术文章,为了让大家在家也能好好学习,特此花了几个小时整理了这些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 让你收获满满! 码个蛋从2017年02月20...
阅读 682·2023-04-25 19:43
阅读 3855·2021-11-30 14:52
阅读 3729·2021-11-30 14:52
阅读 3795·2021-11-29 11:00
阅读 3745·2021-11-29 11:00
阅读 3812·2021-11-29 11:00
阅读 3528·2021-11-29 11:00
阅读 6009·2021-11-29 11:00