ViewModel はいつ生まれていつ死ぬか 【→ Jetpack Compose】

ViewModel は onCleared() を自分が破棄されるときに実行します。


public abstract class ViewModel {

    /**
     * This method will be called when this ViewModel is no longer used and will be destroyed.
     * It is useful when ViewModel observes some data and you need to clear this subscription to
     * prevent a leak of this ViewModel.
     */
    @SuppressWarnings("WeakerAccess")
    protected void onCleared() {
    }

This method will be called when this ViewModel is no longer used and will be destroyed.

👉 ViewModel の概要  |  Android デベロッパー  |  Android Developers hatena-bookmark

ログを吐かせて、その瞬間を確認します。

初期化のタイミングと合わせて確認してみましょう。


@HiltViewModel
class HomeViewModel @Inject constructor() : ViewModel() {

  // ...

  init {
    Timber.d("## ${javaClass.simpleName} initialized.")
  }

  override fun onCleared() {
    Timber.d("## ${javaClass.simpleName} onCleared.")
  }
}

👉 JakeWharton/timber: A logger with a small, extensible API which provides utility on top of Android's normal Log class. hatena-bookmark


...
21077-21077/com.example.app D/HomeViewModel: ## HomeViewModel initialized.
...
21077-21077/com.example.app D/HomeViewModel: ## HomeViewModel onCleared.
...

なんでいまさらこんなことを!

(つづく...)

👉 【Jetpack Compose】ViewModel を捨てて Repository を Composable に直結する hatena-bookmark
👉 Compose を既存のアプリ アーキテクチャと統合する  |  Jetpack Compose  |  Android Developers hatena-bookmark


【AndroidStudio】Android logcat error: Failed to clear Logcat, got an exception executing "adb logcat -c". See idea.log for details.

こんなのでましたけど。

Android logcat error: Failed to clear Logcat, got an exception executing "adb logcat -c". See idea.log for details.

Android logcat error: Failed to clear Logcat, got an exception executing "adb logcat -c". See idea.log for details.

idea.log を見るとこれ。


 [ 250767]   WARN - ea.logcat.AndroidLogcatService -  
com.android.ddmlib.ShellCommandUnresponsiveException
	at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:699)
	at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:475)
	at com.android.ddmlib.internal.DeviceImpl.executeShellCommand(DeviceImpl.java:706)
	at com.android.tools.idea.logcat.AndroidLogcatService.execute(AndroidLogcatService.java:552)
	at com.android.tools.idea.logcat.AndroidLogcatService.lambda$clearLogcat$2(AndroidLogcatService.java:398)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

ググってみると、

use

adb logcat -b all -c

it will clear all buffers. sometime adb logcat -c will not work because of many process using it like android studio.

とのこと。

Android Studio のプロセスが多すぎてバッファが消せない、とのこと。

👉 android - ADB logcat fails to clear the main log - Stack Overflow hatena-bookmark

 

なぜエラーが出始めたのか

[Edit configrations...] から設定を変更しました。

【AndroidStudio】Android logcat error: Failed to clear Logcat, got an exception executing "adb logcat -c". See idea.log for details.

デバッグ実行の前に、自動でログをクリアしたかったのですが。

どこかに、 adb logcat のオプションを設定できるとこなかったけか。

あったような気がするが、見つけられない。


【Dagger-Hilt】「androidx.hilt:hilt-lifecycle-viewmodel」を使ってはならない Dagger 2.34+

The Hilt Android Gradle plugin is applied but no com.google.dagger:hilt-android dependency was found.

The Hilt Android Gradle plugin is applied but no com.google.dagger:hilt-android dependency was found.

すいません、またハマっちゃいました、2回目です。

原因は以下なのですが。

androidx.hilt:hilt-lifecycle-viewmodel artifacts were deprecated in the Dagger 2.34 release in favor of native Hilt API.

👉 ComponentProcessingStep was unable to process '*Application_HiltComponents.SingletonC' · Issue #3257 · google/dagger hatena-bookmark

Migration steps:
...
4. Remove the old androidx.hilt:hilt-lifecycle-viewmodel dependency from your build.gradle file

👉 Release Dagger 2.34 · google/dagger hatena-bookmark

以下があると、ビルドでコケます。


implementation 'androidx.hilt:hilt-lifecycle-viewmodel:x.y.z'

知ってます、みんなハマっています。

 

対応方法

これでいけます。


dependencies {

  //implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
  //kapt 'androidx.hilt:hilt-compiler:1.0.0'

  implementation 'com.google.dagger:hilt-android:2.42'
  kapt 'com.google.dagger:hilt-compiler:2.42'

androidx.hilt.* だけでは、ビルドできないか、インストール→起動後に落ちます。まだあやしい。

androidx.hilt:hilt-lifecycle-viewmodel

 

なぜ、ハマるのか

公式リファレンスに記述があるんですよね、この記述。

Hilt と Jetpack の統合  |  Android デベロッパー  |  Android Developers

👉 Hilt と Jetpack の統合  |  Android デベロッパー  |  Android Developers hatena-bookmark

Hilt に隠れて Dagger のバージョンが見えづらくなってることにも原因があるように思います。

👉 Error: ComponentProcessingStep was unable to process 'AppApplication_HiltComponents.SingletonC' because 'DefaultActivityViewModelFactory' could not be resolved. hatena-bookmark