- Android Jetpack開發(fā):原理解析與應(yīng)用實(shí)戰(zhàn)
- 黃林晴
- 594字
- 2022-07-05 09:43:58
3.2 使用ViewModel解決廣告引導(dǎo)頁屏幕旋轉(zhuǎn)問題
在上一節(jié)中提到了ViewModel類可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后讓數(shù)據(jù)繼續(xù)留存,這時(shí),細(xì)心的讀者就會思考了,該如何使用ViewModel來解決廣告引導(dǎo)頁屏幕旋轉(zhuǎn)問題呢?
在使用ViewModel之前,先引入ViewModel的依賴項(xiàng),代碼如下:
def lifecycle_version = "2.3.1" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
然后新建一個(gè)繼承自ViewModel的AdvertisingViewModel類,在該類中聲明計(jì)時(shí)起始變量millisInFuture,代碼如下:
class AdvertisingViewModel : ViewModel() { /** * 計(jì)時(shí)開始時(shí)間,默認(rèn)5秒 */ var millisInFuture: Long = 5000 }
若開發(fā)者想在ViewModel類中使用資源文件,則要使用到Context上下文了。這里要注意的是,一定不能將Activity的上下文傳給ViewModel,否則會存在內(nèi)存泄漏的風(fēng)險(xiǎn)。這一點(diǎn)本書后面會有詳細(xì)的講解。那這里該如何處理呢?只需要將父類ViewModel修改為AndroidViewModel即可。示例如下:
class AdvertisingViewModel(application: Application) : AndroidViewModel(application) { /** * 計(jì)時(shí)開始時(shí)間,默認(rèn)5秒 */ var millisInFuture: Long = 5000 }
擁有Application的實(shí)例之后就可以訪問資源文件了。在Activity中初始化ViewModel,示例如下:
private lateinit var advertisingViewModel: AdvertisingViewModel override fun onCreate(savedInstanceState: Bundle?) { ... advertisingViewModel = ViewModelProvider(this).get(AdvertisingViewModel::class.java) ... }
接下來只需要將原Activity中的millisInFuture變量統(tǒng)一替換為AdvertisingView-Model中的millisInFuture即可。示例代碼如下:
class AdvertisingActivity : AppCompatActivity() { ... private lateinit var advertisingViewModel: AdvertisingViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_advertising) advertisingViewModel = ViewModelProvider(this).get(AdvertisingViewModel::class.java) val advertisingManage = AdvertisingManage(advertisingViewModel.millisInFuture) lifecycle.addObserver(advertisingManage) tvAdvertisingTime = findViewById(R.id.tv_advertising_time) advertisingManage.advertisingManageListener = object : AdvertisingManage.AdvertisingManageListener { override fun timing(second: Int) { tvAdvertisingTime.text = "廣告剩余$second秒" advertisingViewModel.millisInFuture = second.toLong() * 1000 } } ... } }
運(yùn)行程序,當(dāng)廣告剩余2秒的時(shí)候,旋轉(zhuǎn)屏幕,打印的日志如圖3-4所示。

圖3-4 廣告剩余2秒時(shí)旋轉(zhuǎn)屏幕的日志
從日志中可以看出,廣告剩余2秒的時(shí)候,由于旋轉(zhuǎn)屏幕停止計(jì)時(shí)了,因此旋轉(zhuǎn)后會繼續(xù)從1秒鐘開始計(jì)時(shí),這與使用onSaveInstanceState方法實(shí)現(xiàn)的效果相同。但是從代碼中可以很明顯地看出,使用ViewModel遠(yuǎn)比使用onSaveInstanceState簡潔,這一切都得益于ViewModel的生命周期。
- Java語言程序設(shè)計(jì)
- Boost程序庫完全開發(fā)指南:深入C++”準(zhǔn)”標(biāo)準(zhǔn)庫(第5版)
- 零起步玩轉(zhuǎn)掌控板與Mind+
- Java 開發(fā)從入門到精通(第2版)
- The Modern C++ Challenge
- Java設(shè)計(jì)模式及實(shí)踐
- Bootstrap 4:Responsive Web Design
- Java項(xiàng)目實(shí)戰(zhàn)精編
- Learning Hunk
- Hands-On Natural Language Processing with Python
- C++寶典
- Xcode 6 Essentials
- Java Web開發(fā)實(shí)例大全(基礎(chǔ)卷) (軟件工程師開發(fā)大系)
- ASP.NET 4.0 Web程序設(shè)計(jì)
- Instant Apache Camel Messaging System