首页 > 解决方案 > SplashActivity 在冷启动时做了一个小跳跃

问题描述

对于我的SplashActivity,我使用LiveData和的组合ViewModel来验证使用 Firebase 身份验证的用户。

LiveData

class FirebaseAuthLiveData(private val auth: FirebaseAuth): LiveData<Boolean>(), FirebaseAuth.AuthStateListener {
    override fun onAuthStateChanged(auth: FirebaseAuth) {
        value = auth.currentUser == null
    }

    override fun onActive() {
        super.onActive()
        auth.addAuthStateListener(this)
    }

    override fun onInactive() {
        super.onInactive()
        auth.removeAuthStateListener(this)
    }
}

ViewModel

class FirebaseAuthViewModel: ViewModel() {
    val repository = FirebaseAuthRepository()

    fun getAuthState(): LiveData<Boolean> {
        return repository.getFirebaseAuthState()
    }
}

存储库:

class FirebaseAuthRepository {
    private val auth = FirebaseAuth.getInstance()

    fun getFirebaseAuthState(): FirebaseAuthLiveData {
        return FirebaseAuthLiveData(auth)
    }
}

SplashActivity

class SplashActivity : AppCompatActivity() {
    private lateinit var firebaseAuthViewModel: FirebaseAuthViewModel
    private lateinit var firebaseAuthLiveData: Unit

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setTheme(R.style.SplashTheme)

        firebaseAuthViewModel = ViewModelProvider(this).get(FirebaseAuthViewModel::class.java)
        firebaseAuthLiveData = firebaseAuthViewModel.getAuthState().observe(this, { UserSignedOut ->
            val intent = if (UserSignedOut) {
                Intent(this, LoginActivity::class.java)
            } else {
                Intent(this, MainActivity::class.java)
            }
            startActivity(intent)
        })
    }
}

现在的问题是当我启动我的应用程序时,它SplashActivity确实像一个小跳跃。LoginActivity在进入或之前,它会很快上升然后下降MainActivity

现在,我的旧SplashActivity的没有使用LiveDataViewModel看起来像这样,没有发生小跳:

class SplashActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.SplashTheme)
        super.onCreate(savedInstanceState)

        Firebase.auth.setLanguageCode("en")
    }

    override fun onStart() {
        super.onStart()

        val user = Firebase.auth.currentUser

        val intent = if (user != null) {
            Intent(this, MainActivity::class.java)
        } else {
            Intent(this, LoginActivity::class.java)
        }

        startActivity(intent)
        finish()
    }
}

如何修复我的LiveData,ViewModel或 Repository 类以确保在我的应用程序启动时不会发生小跳转SplashActivity

标签: androidkotlinfirebase-authenticationandroid-livedataandroid-viewmodel

解决方案


推荐阅读