Jetpack + 協(xié)程的玩安卓客戶端

在此非常感謝鴻洋大神提供的 WanAndroid API

該項(xiàng)目基于「玩 Android 接口」接口蔚出,整體采用 MVVM, Android Jectpack, Retrofit, Kotlin 協(xié)程進(jìn)行編寫。 是由 kukyxsTaonce 一起編寫完成,目前已完成所有的開發(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

CoroutinesWanAndroid 客戶端

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 客戶端的界面截圖:

入口頁.png
公眾號文章列表.png
首頁-側(cè)欄.png
首頁-公眾號.png
首頁-項(xiàng)目分類.png
首頁-學(xué)習(xí)體系.png
首頁-最新博文.png
搜索-結(jié)果列表.png
搜索-歷史記錄.png
文章詳情.png
我的待辦-編輯.png
我的待辦-列表.png
我的待辦-篩選.png
我的待辦-新建.png
我的收藏-網(wǎng)址.png
我的收藏-文章.png

技術(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 系列
  1. 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>
  1. Lifecycle + ViewModel

Lifecycle 可以對 Activity 或者 Fragment 的生命周期進(jìn)行感應(yīng),ViewModel 繼承了 Lifecycle 此特性腥寇,并且通過對內(nèi)部不可見 Fragment 的持有成翩,從而擁有屏幕在橫豎屏切換的時候數(shù)據(jù)不丟失的特點(diǎn)。

  1. LiveData

LiveData 在被推出的時候并不引人注目赦役,總覺得他很雞肋麻敌,它能實(shí)現(xiàn)的 RxJava 都能實(shí)現(xiàn),相反并不可以掂摔。不過隨著 LiveDataDataBinding 术羔、PagingRoom 的原生支持,使它有了立足之地乙漓。通過和 DataBinding 的結(jié)合级历,可以達(dá)到數(shù)據(jù)變化后自動更新UI的操作,而且我們也可以在主線程或者子線程更新數(shù)據(jù)叭披,只需要通過 setValue() 或者 postValue() 就能完成寥殖。

這里就不列代碼出來了,代碼都是比較分散的涩蜘,大家可以去項(xiàng)目中逐一查看嚼贡。

  1. Paging

一個能讓 RecyclerView 連續(xù)加載的狂熱分子,能讓用戶體會到絲滑般的滑動效果同诫,并且它還可以直接結(jié)合 LiveDataDiffUtil 使用粤策,更是香噴噴,無奈再香的東西它的坑還是存在的误窖,你說你能結(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ā)出真香的感嘆!

  1. 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虫碉,隨后出現(xiàn)的幾起案子贾惦,更是在濱河造成了極大的恐慌,老刑警劉巖敦捧,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件须板,死亡現(xiàn)場離奇詭異,居然都是意外死亡兢卵,警方通過查閱死者的電腦和手機(jī)习瑰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秽荤,“玉大人甜奄,你說我怎么就攤上這事⊥趼耍” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵滓鸠,是天一觀的道長雁乡。 經(jīng)常有香客問我,道長糜俗,這世上最難降的妖魔是什么踱稍? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任曲饱,我火速辦了婚禮,結(jié)果婚禮上珠月,老公的妹妹穿的比我還像新娘扩淀。我一直安慰自己,他們只是感情好啤挎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布驻谆。 她就那樣靜靜地躺著,像睡著了一般庆聘。 火紅的嫁衣襯著肌膚如雪胜臊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天伙判,我揣著相機(jī)與錄音象对,去河邊找鬼。 笑死宴抚,一個胖子當(dāng)著我的面吹牛勒魔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播菇曲,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼冠绢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了羊娃?” 一聲冷哼從身側(cè)響起唐全,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蕊玷,沒想到半個月后邮利,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垃帅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年延届,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贸诚。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡方庭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酱固,到底是詐尸還是另有隱情械念,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布运悲,位于F島的核電站龄减,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏班眯。R本人自食惡果不足惜希停,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一烁巫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宠能,春花似錦亚隙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亦歉,卻和暖如春恤浪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肴楷。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工水由, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赛蔫。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓砂客,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呵恢。 傳聞我的和親對象是個殘疾皇子鞠值,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容