Я редко бываю Не могу получить доступ к ViewModels из onDestroy - PullRequest
0 голосов
/ 11 мая 2018

Я получил такую ​​ошибку после запуска приложения, и это случается очень редко.

Здесь моя полная трассировка стека Java связана:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.mycompany.myapp.dev, PID: 11145
              java.lang.IllegalStateException: Can't access ViewModels from onDestroy
                  at android.arch.lifecycle.HolderFragment$HolderFragmentManager.findHolderFragment(HolderFragment.java:136)
                  at android.arch.lifecycle.HolderFragment$HolderFragmentManager.holderFragmentFor(HolderFragment.java:155)
                  at android.arch.lifecycle.HolderFragment.holderFragmentFor(HolderFragment.java:81)
                  at android.arch.lifecycle.ViewModelStores.of(ViewModelStores.java:42)
                  at android.arch.lifecycle.ViewModelProviders.of(ViewModelProviders.java:88)
                  at com.mycompany.myapp.ui.splash.SplashActivity$viewModel$2.invoke(SplashActivity.kt:47)
                  at com.mycompany.myapp.ui.splash.SplashActivity$viewModel$2.invoke(SplashActivity.kt:40)
                  at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:130)
                  at com.mycompany.myapp.ui.splash.SplashActivity.getViewModel(SplashActivity.kt:0)
                  at com.mycompany.myapp.ui.splash.SplashActivity$onResume$1.run(SplashActivity.kt:62)
                  at android.os.Handler.handleCallback(Handler.java:815)
                  at android.os.Handler.dispatchMessage(Handler.java:104)
                  at android.os.Looper.loop(Looper.java:207)
                  at android.app.ActivityThread.main(ActivityThread.java:5805)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

Вот мой код, но это оченьстранно, потому что я не установлен на onDestroy()

class SplashActivity : AppCompatActivity(){
    GoogleApiClient.OnConnectionFailedListener {
    val context = this

    val viewModel by lazy {
        ViewModelProviders.of(this).get(ListModel::class.java)
    }

    override fun onResume() {
        super.onResume()

        Handler().postDelayed(object: Runnable{
            override fun run() {
                val testConnection = viewModel?.testConnectionLiveData()
                viewModel?.testConnection()

                testConnection?.observe(context, Observer<TestConnectionData> { tc ->
                    tc?.let {
                        if (tc.status == "FAILED") {
                            var builder: AlertDialog = AlertDialog.Builder(context).create()
                            builder.setTitle("Failed Connect To Server")
                            builder.setMessage("The app cannot reach on the server. Make sure your device connect the internet and try again!")
                            builder.setButton(AlertDialog.BUTTON_POSITIVE, "OK", object : DialogInterface.OnClickListener {
                                override fun onClick(dialog: DialogInterface?, which: Int) {
                                    var i = Intent(context, LoginActivity::class.java)
                                    startActivity(i)
                                }
                            })

builder.setIcon(android.R.drawable.ic_dialog_alert)
                        builder.setCancelable(false)
                        builder.setCanceledOnTouchOutside(false)
                        builder.show()
                        } else if(tc.status == "SUCCESS"){
                            var i = Intent(context, LoginActivity::class.java)
                            startActivity(i)
                        }
                    }
                })
            }
        }, 5000)
    }

    @SuppressLint("MissingPermission")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN)
        setContentView(R.layout.activity_splash)
    }
}

Я пытаюсь снова запустить на Android Studio, и все работает нормально.

Я хочу знать, почему это может произойти и какрешить это?

1 Ответ

0 голосов
/ 06 августа 2018

Изучая исходный код Android, он проверяет, не уничтожена ли поддержка FragmentManager при попытке получить ViewModel.

Calling

ViewModelProviders.of(this).get(ListModel::class.java)

доберется до

private static HolderFragment findHolderFragment(FragmentManager manager) {
    if (manager.isDestroyed()) {
        throw new IllegalStateException("Can't access ViewModels from onDestroy");
    }

Что вызовет исключение, если FragmentManager будет уничтожен. Будьте внимательны, когда исполняемый код выполняется в соответствии с жизненным циклом приложения.

Чтобы решить эту проблему, вы можете:

  1. проверка для getSupportFragmentManager (). IsDestroyed () перед использованием ViewModel
  2. окружить с помощью try catch и игнорировать, если это не влияет на ваш нормальный поток
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...