Google I/O 2021:LiveData 即將被取代?

在 Google I/O 2021 的 Q&A 中,有一個有趣的問題被提起:Is LiveData going to be deprecated? 翻譯成中文的意思就是,LiveData 會被棄用嗎? 應該有一些人看到這問題被嚇到,想說 LiveData 不是近幾年才出現的嗎?怎麼沒多久就要面臨這問題(囧。 這問題其來有因,讓我們從 LiveData 的出現開始說起吧! LiveData 的出現 LiveData 在 2017 隨著 Google 推行的 MVVM 架構一同出現,其目的是為了協助使用者實作 MVVM 中 ViewModel 的雙向綁定。LiveData 實做方式是用觀察者模式,這讓很多人聯想到 RxJava,甚至常被拿來與 RxJava 做比較。這邊篇幅有限,因此不會贅述其差異,有興趣的可以自行去了解。 備註:雖然 RxJava 和 LiveData 都是使用觀察者模式,但其目的和應用場境都有些差異,因此放在一起比較誰好誰壞沒有意義。 LiveData 的特色 因為 LiveData 簡單易用的特性,使它很適合用來處理資料與介面之間的綁定。當資料更新時,它可以自動去更新介面。同時,它結合了另一個 Jetpack 套件 — Lifecycle,讓它只會在介面處於 STARTED 或 RESUMED 的時候,才會觸發更新,避免許多生命週期的問題。 或許有人會覺得 RxJava 不就可以做到一樣的事情了嗎?確實,上面提到的需求 RxJava 都可以實現,但 RxJava 使用起來遠比 LiveData 複雜,因此在簡單的場景,LiveData 更能勝任,所以常會看到一些文章或專案將 LiveData 與 RxJava 互相搭配使用。...

October 2, 2021 · 1 min · 姚韋辰(Andy Yao)

Google OAuth 登入新帳戶失敗(12502)

今天在開發的時候遇到 GoogleSignIn 在 onActivityResult() 時回復 status code 12502,需要再一次登入才會成功。查了官方文件,對照的 Constant 是 SIGN_IN_CURRENTLY_IN_PROGRESS,它意思是「登入程序正在進行中,因此無法繼續」。網路上有人提到說如果在 manifest 或是 Intent flag 中將 noHistory 設為 true 也會遇到這問題,但我自己沒設為 true 也遇到(囧 重現方式 使用 Google OAuth 登入,點擊「新增其他帳戶」,然後使用剛新增的帳戶來登入,則會遇到 SIGN_IN_CURRENTLY_IN_PROGRESS (12502),之後再重新點擊同個帳號登入則可以成功。 解決方法 在 googlesamples/google-services 上看到有人發類似的 issue,但這問題一直 open。下面有人提出 workaround 可以暫時解決這問題: 1 2 3 4 5 6 7 8 9 10 if (e.getStatusCode() == SIGN_IN_CURRENTLY_IN_PROGRESS) { /* * https://github.com/googlesamples/google-services/issues/345 */ GoogleSignInAccount accountOld = GoogleSignIn.getLastSignedInAccount(activity.getApplicationContext()); if (accountOld != null) { LOG.info("Got cached sign-in"); handleSignedInAccount(accountOld); } } 不過這解法也不是到很理想,還是期待官方能解決這問題,或至少更詳細的說明發生的原因,不然單純看到 SIGN_IN_CURRENTLY_IN_PROGRESS 會滿問號的(囧...

September 2, 2021 · 1 min · 姚韋辰(Andy Yao)

在 M1 Macbook 下開發 Android

在購買 Macbook Air M1 後,被它的效能和續航驚艷到了,但同時,還有許多應用沒有很好的支援 M1 晶片。所以身為 Android Developer 的我 ,當然要來嘗試在 M1 晶片下運行 Android Studio 看看啦~ ...

May 5, 2021 · 1 min · 姚韋辰(Andy Yao)

[Android] PopupWindow 設置 gravity 無效的問題

前言 今天在寫公司專案的時候遇到部分 Android 7 的手機,PopupWindow 不會理會設置好的 gravity,會直接跑到頂部。 原因 在 Android Code Search 追了一下原始碼,發現 Android 7 在執行 PopupWindow.update() 的時候,會將 gravity 重設,因此造成 gravity 被重置為 Gravity.START | Gravity.TOP。 有興趣的話可以自己看一下 Google 後來修復的 commit 解法 剛好出問題的那段程式看起來沒有必要使用 update(),因此拿掉後問題就修復了。當然如果你一定需要使用 update() 的話,可以參考這篇 SlackOverflow,裡面有各種大神給的解法,這邊就不贅述囉!

October 13, 2020 · 1 min · 姚韋辰(Andy Yao)

Android 11 新增無線偵錯 (Wireless Debugging)

不久前 Android 11 正式發布,可以看到有許多很酷炫的新功能,其中對身為 Android 開發者的我來說最興奮的應該就是「無線偵錯」了,這樣出門就可以更方便的開發了,因此趁著這段空閑就來試試看! ...

October 10, 2020 · 1 min · 姚韋辰(Andy Yao)