Просмотр исходного кода

fix: viewModel hold activity may cause memory leak

Xwite 3 лет назад
Родитель
Сommit
b9fe1fee58

+ 0 - 1
app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt

@@ -107,7 +107,6 @@ class BookInfoActivity :
         binding.flAction.setBackgroundColor(bottomBackground)
         binding.tvShelf.setTextColor(getPrimaryTextColor(ColorUtils.isColorLight(bottomBackground)))
         binding.tvToc.text = getString(R.string.toc_s, getString(R.string.loading))
-        viewModel.callBack = this
         viewModel.bookData.observe(this) { showBook(it) }
         viewModel.chapterListData.observe(this) { upLoading(false, it) }
         viewModel.waitDialogData.observe(this) { upWaitDialogStatus(it) }

+ 5 - 5
app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt

@@ -34,8 +34,7 @@ import java.net.URLDecoder
 /**
  * rss阅读界面
  */
-class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>(false),
-    ReadRssViewModel.CallBack {
+class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>(false) {
 
     override val binding by viewBinding(ActivityRssReadBinding::inflate)
     override val viewModel by viewModels<ReadRssViewModel>()
@@ -50,7 +49,8 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
     }
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
-        viewModel.callBack = this
+        viewModel.upStarMenuData.observe(this) { upStarMenu() }
+        viewModel.upTtsMenuData.observe(this) { upTtsMenu(it) }
         binding.titleBar.title = intent.getStringExtra("title")
         initWebView()
         initLiveData()
@@ -223,7 +223,7 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
         }
     }
 
-    override fun upStarMenu() {
+    private fun upStarMenu() {
         starMenuItem?.isVisible = viewModel.rssArticle != null
         if (viewModel.rssStar != null) {
             starMenuItem?.setIcon(R.drawable.ic_star)
@@ -235,7 +235,7 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
         starMenuItem?.icon?.setTintMutate(primaryTextColor)
     }
 
-    override fun upTtsMenu(isPlaying: Boolean) {
+    private fun upTtsMenu(isPlaying: Boolean) {
         launch {
             if (isPlaying) {
                 ttsMenuItem?.setIcon(R.drawable.ic_stop_black_24dp)

+ 6 - 9
app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt

@@ -27,13 +27,14 @@ import java.util.*
 
 
 class ReadRssViewModel(application: Application) : BaseViewModel(application) {
-    var callBack: CallBack? = null
     var rssSource: RssSource? = null
     var rssArticle: RssArticle? = null
     var tts: TTS? = null
     val contentLiveData = MutableLiveData<String>()
     val urlLiveData = MutableLiveData<AnalyzeUrl>()
     var rssStar: RssStar? = null
+    val upTtsMenuData = MutableLiveData<Boolean>()
+    val upStarMenuData = MutableLiveData<Boolean>()
 
     fun initData(intent: Intent) {
         execute {
@@ -72,7 +73,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application) {
                 }
             }
         }.onFinally {
-            callBack?.upStarMenu()
+            upStarMenuData.postValue(true)
         }
     }
 
@@ -126,7 +127,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application) {
                 rssStar = it
             }
         }.onSuccess {
-            callBack?.upStarMenu()
+            upStarMenuData.postValue(true)
         }
     }
 
@@ -196,11 +197,11 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application) {
             tts = TTS().apply {
                 setSpeakStateListener(object : TTS.SpeakStateListener {
                     override fun onStart() {
-                        callBack?.upTtsMenu(true)
+                        upTtsMenuData.postValue(true)
                     }
 
                     override fun onDone() {
-                        callBack?.upTtsMenu(false)
+                        upTtsMenuData.postValue(false)
                     }
                 })
             }
@@ -213,8 +214,4 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application) {
         tts?.clearTts()
     }
 
-    interface CallBack {
-        fun upStarMenu()
-        fun upTtsMenu(isPlaying: Boolean)
-    }
 }