在此非常感謝鴻洋大神提供的 WanAndroid API
該項(xiàng)目基于「玩 Android 接口」接口蔚出,整體采用 MVVM, Android Jectpack, Retrofit, Kotlin 協(xié)程進(jìn)行編寫。 是由 kukyxs 和 Taonce 一起編寫完成,目前已完成所有的開發(fā)功能挪圾,細(xì)節(jié)有待調(diào)整做院。
起因
說起一起開源這個項(xiàng)目的初衷萨西,總結(jié)來說是緣于學(xué)習(xí)和熟悉 Jetpack 和協(xié)程知識,結(jié)果在過程中一步一個雷吊奢,雷的體無完膚。從零到1.0版本誕生總共歷時一個月纹烹,時間不算長但是收獲很多页滚,能進(jìn)一步的對協(xié)程和 Jetpack 的使用加深理解,下面是該項(xiàng)目的地址铺呵,如果你對本項(xiàng)目感興趣或者認(rèn)為本項(xiàng)目還不錯的還請點(diǎn)個 star:
1.0 版本的誕生
項(xiàng)目于8月6日 released 1.0版本裹驰,實(shí)現(xiàn)了 WanAndroid API 的基本功能,8月8日優(yōu)化體驗(yàn)之后片挂,released 1.0.1版本幻林。下面介紹下目前實(shí)現(xiàn)的功能:
- 注冊和登錄
- 首頁最新博文和 Banner 圖
- 項(xiàng)目分類
- 學(xué)習(xí)體系分類
- 公眾號分類和公眾號文章列表
- 文章詳情查看
- 文章收藏和取消收藏
- TODO待辦
- 搜索功能
以下是 WanAndroid 客戶端的界面截圖:
技術(shù)點(diǎn)介紹
- 協(xié)程
用來代替 RxJava贞盯,處理異步操作,它可以讓開發(fā)者體會到以同步的方式去實(shí)現(xiàn)異步操作沪饺。不過在該項(xiàng)目中有的地方還是結(jié)合了協(xié)程 + 回調(diào)的形式躏敢,蜜汁尷尬 -,暫時沒想到有什么好的解決方案整葡。下面這段代碼是通過協(xié)程 + Retrofit
進(jìn)行網(wǎng)絡(luò)請求件余。
// 加載首頁置頂文章
suspend fun loadTops(): List<ArticleDetail>? = withContext(Dispatchers.IO) { RetrofitManager.apiService.topArticle(PreferencesHelper .fetchCookie(WanApplication.instance)).data
}
- Jetpack 系列
- DataBinding
最大的好處就是大幅度的節(jié)約了UI控件的設(shè)置代碼,不需要在 V 層去設(shè)置某個控件的點(diǎn)擊事件或者屬性等遭居,我們可以更專注的去寫業(yè)務(wù)邏輯代碼啼器。
不過它的劣勢也很明顯,在 xml
文件中新增 DB
屬性之后需要 build 下工程俱萍,假如出現(xiàn)錯誤了端壳,有時候報錯的信息也很模糊...
下面的這段代碼是通過 DataBinding
來綁定 RecyclerView
的點(diǎn)擊、長按事件和 Adapter
屬性鼠次,寫起來非常舒服更哄。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="adapter"
type="androidx.paging.PagedListAdapter" />
<variable
name="itemClick"
type="com.kuky.demo.wan.android.base.OnItemClickListener" />
<variable
name="itemLongClick"
type="com.kuky.demo.wan.android.base.OnItemLongClickListener" />
</data>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/article_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adapter="@{adapter}"
android:orientation="vertical"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:scrollbars="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
bind:hasFixedSize="@{true}"
bind:pageItemClick="@{itemClick}"
bind:pageItemLongClick="@{itemLongClick}"
tools:itemCount="20"
tools:listitem="@layout/recycler_home_article" />
</layout>
- Lifecycle + ViewModel
Lifecycle 可以對 Activity
或者 Fragment
的生命周期進(jìn)行感應(yīng),ViewModel 繼承了 Lifecycle 此特性腥寇,并且通過對內(nèi)部不可見 Fragment
的持有成翩,從而擁有屏幕在橫豎屏切換的時候數(shù)據(jù)不丟失的特點(diǎn)。
- LiveData
LiveData 在被推出的時候并不引人注目赦役,總覺得他很雞肋麻敌,它能實(shí)現(xiàn)的 RxJava 都能實(shí)現(xiàn),相反并不可以掂摔。不過隨著 LiveData 對 DataBinding 术羔、Paging 和 Room 的原生支持,使它有了立足之地乙漓。通過和 DataBinding 的結(jié)合级历,可以達(dá)到數(shù)據(jù)變化后自動更新UI的操作,而且我們也可以在主線程或者子線程更新數(shù)據(jù)叭披,只需要通過 setValue()
或者 postValue()
就能完成寥殖。
這里就不列代碼出來了,代碼都是比較分散的涩蜘,大家可以去項(xiàng)目中逐一查看嚼贡。
- Paging
一個能讓 RecyclerView
連續(xù)加載的狂熱分子,能讓用戶體會到絲滑般的滑動效果同诫,并且它還可以直接結(jié)合 LiveData 和 DiffUtil 使用粤策,更是香噴噴,無奈再香的東西它的坑還是存在的误窖,你說你能結(jié)合 LiveData 使用是多么好的事叮盘,為啥在數(shù)據(jù)在返回的時候你傳個空列表嘛意思么秩贰,延時去取數(shù)據(jù)?
var articles: LiveData<PagedList<ArticleDetail>>? = null
fun fetchHomeArticle() {
articles = LivePagedListBuilder(
HomeArticleDataSourceFactory(repository),
PagedList.Config.Builder()
.setPageSize(20)
.setEnablePlaceholders(true)
.setInitialLoadSizeHint(20)
.build()
).build()
}
通過返回 LiveData
類型的值熊户,然后再 observer{}
萍膛,這時候你就會不由自主的發(fā)出真香的感嘆!
- Navigation
Google官方**單 Activity 多 Fragment 的架構(gòu)組件嚷堡,為了讓開發(fā)者更好的處理 Fragment
之間的跳轉(zhuǎn)問題蝗罗,項(xiàng)目一開始也是秉承著單 Activity 多 Fragment **的原則去進(jìn)行編寫,在1.0之前都是采用的這種模式蝌戒,不過在1.0.1版本將啟動頁換成了 Activity
串塑,原因在于無法處理啟動白屏的問題。
fun viewDetail(controller: NavController, @IdRes id: Int, url: String) {
if (url.isBlank()) return
controller.navigate(id, Bundle().apply { putString("url", url) })
}
總結(jié)
如果你看到這里北苟,那么對 CoroutinesWanAndroid 已經(jīng)了解的差不多了桩匪,這個項(xiàng)目還是有很多新穎的知識點(diǎn)和技術(shù),如果你對 Kotlin友鼻、協(xié)程 或者 Jetpack 系列感興趣的話傻昙,還是非常推薦你了解下這個項(xiàng)目。在了解的過程中彩扔,如若對項(xiàng)目存在什么疑問和見解妆档,歡迎提出你的 Issues