敞开生长之旅!这是我参与「日新方案 12 月更文应战」的第6天,点击查看活动详情

持续《Android编程威望指南》第 24 章,开端深入学习了。

六、深入学习:其他JSON数据解析器和数据格式

这儿首要介绍便是,Gson 不是唯一的 JSON 数据解析器。Square 公司还供给了另外一种 JSON 解析器叫 Moshi。

那么,已然咱们要深入学习,就不仅仅只看一眼书中的概念啦,开端搜索一下 Moshi 吧,它的 Github 地址:github.com/square/mosh…

从 Github 介绍就知道,Moshi 是适用于 Android、Java 和 Kotlin 的现代 JSON 库。 它使得将 JSON 解析为 Java 和 Kotlin 类变得容易。但是 Gson 的介绍便是说它是适用于 Java 的 JSON 解析库,因而,其实如果咱们的使用,主 Kotlin 语言,又是使用的 Gson,就得多注意注意下解析问题了,网上我就搜到一篇,gson 反序列化成 data class 时的坑 详细自行看看文章啦。

Square 公司也为 Retrofit 供给了 Moshi 版数据类型转换器: github.com/square/retr…

找到一篇 Moshi 实践的文章,照着代码敲一遍了解了解。 blog.csdn.net/yuzhiqiang_…

当然,从 Retrofit 的官方源码目录也能够看出,它还支撑其他常见的数据格式。

《Android编程权威指南》之HTTP与后台任务(深入学习)

真是强大额库呢。有得学啦!

七、深入学习:吊销网络恳求

目前的 PhotoGallery 项目呢,是打开了它就会去进行网络恳求,可是如果使用启动就快速回退,网络恳求仍是会持续履行,它并不会停止。这其实也是挺浪费资源的,尽管不会导致内存走漏「由于FlickrFetchr 没有引用任何 UI 相关的组件,也没引用 ViewModel」,咱们仍是来持续优化下这个问题。

书中引荐的方式呢,便是把网络恳求的 Call 目标保存起来,然后调用 Call.cancel() 吊销网络恳求。吊销一个 Call 目标时,一个对应的 Callback.onFailure(…) 函数也会被调用。能够查看 Call.isCancelled 的值,判断 Callback 失败是不是由于吊销了网络恳求(回来 true 值表示吊销成功)

  • 开端实践敲代码,新建 Repository.kt:
class Repository {
    private lateinit var flickrCall: Call<FlickrResponse>
    fun addFlickrCall(call: Call<FlickrResponse>) {
        flickrCall = call
    }
    fun cancelRequestInFlight() {
        if (::flickrCall.isInitialized) {
            flickrCall.cancel()
        }
    }
}
  • 完善 PhotoGalleryViewModel.kt
class PhotoGalleryViewModel : ViewModel() {
    private val repository = Repository()
    val galleryItemLiveData: LiveData<List<GalleryItem>> = FlickrFetchr().fetchPhotos()
    override fun onCleared() {
        super.onCleared()
        repository.cancelRequestInFlight()
    }
}
  • 完善 FlickrFetchr
fun fetchPhotos(): LiveData<List<GalleryItem>> {
    val responseLiveData: MutableLiveData<List<GalleryItem>> = MutableLiveData()
    val flickrHomePageRequest: Call<FlickrResponse> = flickrApi.fetchPhotos()
    val repository = Repository()
    repository.addFlickrCall(flickrHomePageRequest)
    flickrHomePageRequest.enqueue(object : Callback<FlickrResponse> {
        override fun onResponse(call: Call<FlickrResponse>, response: Response<FlickrResponse>) {
            Log.d(TAG, "Response received : ${response.body()}")
            val flickrResponse: FlickrResponse? = response.body()
            val photoResponse: PhotoResponse? = flickrResponse?.photos
            var galleryItems: List<GalleryItem> = photoResponse?.galleryItems ?: mutableListOf()
            galleryItems = galleryItems.filterNot { it.url.isBlank() }
            responseLiveData.value = galleryItems
        }
        override fun onFailure(call: Call<FlickrResponse>, t: Throwable) {
            Log.e(TAG, "Failed to fetch photos", t)
            if (call.isCanceled){
                Log.e(TAG, "request Canceled")
            }
        }
    })
    return responseLiveData
}

八、深入学习:管理依靠

这儿首要是说 FlickrFechr 对 FlickrApi 有依靠,然后再单元测验的时候,测验这两个类比较困难不方便。然后推出 Dependecy injection(DI) 规划形式,它能够把 FlickrApi 的代码逻辑中心化处理,即创建一个各个类都需要的依靠。

然后举了个比如,使用 DI 形式后,FlickrFetchr 代码大致为:

class FlickrFetchr(flickrApi: FlickrApi){
    fun fetchContents():LiveData<String>{
        ...
    }
}

Android 平台中,Google 引荐的 DI 完成库是 Dagger2。

不过据我所知,不仅仅有 Dagger2,还有个 Hilt,将依靠注入场景化了,专门为 Android 开发供给。

关于 使用 Hilt 完成依靠注入的地址能够参考官方文档:

developer.android.com/training/de…

其他

PhotoGallery 项目 Demo 地址:

github.com/visiongem/A…


重视我吖~❤️

大众号:妮K妮K妮