使用:

val retrofit = Retrofit.Builder()
.baseUrl(“https://baidu.com”)
.client(okHttpClient.build())
.build()

val api = retrofit.create(DemoService::class.java)
val loginService = api.login(“1”, “1”)
loginService.enqueue(object : Callback {
override fun onFailure(call: Call, t: Throwable) {

}

override fun onResponse(call: Call, response: Response) {

}
})

这里不再细说。

在关闭网络请求的时候,需要在onDestroy中调用cancel方法:

override fun onDestroy() {
super.onDestroy()
loginService.cancel()
}

这种方式,容易导致忘记调用cancel方法,而且网络操作和关闭请求的操作是分开的,不利于管理。

这当然不是优雅的方法。随着Rx的火爆,我们项目的网络请求方式,也逐渐转为了Rx的方式

2. RxJava

此种使用方式,百度一下,到处都是教程讲解,可见此种方式起码是大家较为认可的一种方案。

在Rx的使用中,我们也尝试了各种各样的封装方式,例如自定义Subscriber,将onNext、onCompletedonError进行拆分组合,满足不同的需求。

首先在Retrofit里添加Rx转换器RxJava2CallAdapterFactory.create()

addCallAdapterFactory(RxJava2CallAdapterFactory.create())

RxJava的使用方式大体如下,先将接口的Call改为Observable

interface DemoService {

@POST(“oauth/login”)
@FormUrlEncoded
fun login(@Field(“name”) name: String, @Field(“pwd”) pwd: String): Observable
}

使用:(配合RxAndroid绑定声明周期)

api.login(“1”,“1”)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) //RxAndroid
.subscribe(object :Observer {
override fun onSubscribe(d: Disposable) {

}

override fun onComplete() {

}

override fun onNext(t: String) {

}

override fun onError(e: Throwable) {
}
})

这种使用方式确实方便了不少,响应式编程的思想也很优秀,一切皆为事件流。通过RxAndroid来切换UI线程和绑定页面生命周期,在页面关闭的时候,自动切断向下传递的事件流。

RxJava最大的风险即在于内存泄露,而RxAndroid确实规避了一定的泄露风险。 并且通过查看RxJava2CallAdapterFactory的源码,发现也确实调用了cancel方法,嗯……貌似不错呢。 但总是觉得RxJava过于庞大,有些大材小用。

3. LiveData

随着项目的的推进和Google全家桶的发布。一个轻量化版本的RxJava进入到了我们视线,那就是LiveDataLiveData借鉴了很多RxJava的的设计思想,也是属于响应式编程的范畴。LiveData的最大优势即在于响应Acitivty的生命周期,不用像RxJava再去绑定声明周期。

同样的,我们首先需要添加LiveDataCallAdapterFactory (链接里是google官方提供的写法,可直接拷贝到项目中),用于把retrofit的Callback转换为LiveData

addCallAdapterFactory(LiveDataCallAdapterFactory.create())

接口改为:

interface DemoService {

@POST(“oauth/login”)
@FormUrlEncoded
fun login(@Field(“name”) name: String, @Field(“pwd”) pwd: String): LiveData
}

调用:

api.login(“1”, “1”).observe(this, Observer {string ->

})

以上就是最基础的使用方式,在项目中使用时候,通常会自定义Observer,用来将各种数据进行区分。

在上面调用的observe方法中,我们传递了一个this,这个this指的是声明周期,一般我们在AppCompatActivity中使用时,直接传递其本身就可以了。

下面简单跳转源码进行说明下。通过查看源码可以发现:

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer)

this本身是传递的LifecycleOwner

那么我们在一层层跳转AppCompatActivity,会发现AppCompatActivity是继承于SupportActivity的父类:

public class SupportActivity extends Activity implements LifecycleOwner, Component

其本身对LifecycleOwner接口进行了实现。也就是说,除非特殊要求,一般我们只需要传递其本身就可以了。LiveData会自动处理数据流的监听和解除绑定。

通常来说:在onCreate中对数据进行一次性的绑定,后面就不需要再次绑定了。

当生命周期走到onStartonResume的时候,LiveData会自动接收事件流;

当页面处于不活动的时候,将会暂停接收事件流,页面恢复时恢复数据接收。(例如A跳转到B,那么A将会暂停接收。当从B回到A以后,将恢复数据流接收)

当页面onDestroy时候,会自动删除观察者,从而中断事件流。

可以看出LiveData作为官方套件,使用简单,生命周期的响应也是很智能的,一般都不需要额外处理了。

(更高级的用法,可以参考官方Demo,可以对数据库缓存等待都进行一整套的响应式封装,非常nice。建议学习下官方的封装思想,就算不用,也是对自己大有裨益)

4. Kotlin协程

上面说了那么多,这里步入了正题。大家仔细观察下会发现,上面均是使用的Retrofitenqueue异步方法,再使用Callback进行的网络回调,就算是RxJava和Livedata的转换器,内部其实也是使用的Callback。在此之前,Retrofit的作者也写了一个协程的转换器,地址在这,但内部依然使用的是Callback,本质均为一样。(目前该库才被废弃,其实我也觉得这样使用协程就没意义了,Retrofit在最新的2.6.0版本,直接支持了kotlin协程的suspend挂起函数),

之前了解Retrofit的小伙伴应该知道,Retrofit是有同步和异步两种调用方式的。

void enqueue(Callback callback);

上面这就是异步调用方式,传入一个Callback,这也是我们最最最常用到的方式。

Response execute() throws IOException;

上面这种是同步调用方法,会阻塞线程,返回的直接就是网络数据Response,很少使用。

后来我就在思考,能不能结合kotlin的协程,抛弃Callback,直接使用Retrofit的同步方法,把异步当同步写,代码顺序书写,逻辑清晰,效率高,同步的写法就更加方便对象的管理。

说干就干。

首先写一个协程的扩展方法:

val api = ……
fun CoroutineScope.retrofit() {
this.launch(Dispatchers.Main) {
val work = async(Dispatchers.IO) {
try {
api.execute() // 调用同步方法
} catch (e: ConnectException) {
e.logE()
println(“网络连接出错”)
null
} catch (e: IOException) {
println(“未知网络错误”)
null
}
}
work.invokeOnCompletion { _ ->
// 协程关闭时,取消任务
if (work.isCancelled) {
api.cancel() // 调用 Retrofit 的 cancel 方法关闭网络
}
}
val response = work.await() // 等待io任务执行完毕返回数据后,再继续后面的代码

response?.let {

if (response.isSuccessful) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

本文在开源项目:【GitHub 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-YuaIHdx6-1710854906427)]

本文在开源项目:【GitHub 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐