这样制作闪屏安全吗?

问题描述 投票:0回答:4

我已经为我的应用程序制作了这个启动屏幕,但我不确定这是否是最好的选择。因为当应用程序启动时它正在休眠线程。这是代码,我使用导航组件,因此没有可用的教程。 SplashFragment.kt

class SplashFragment : Fragment() {

private lateinit var rootview:View

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    // Inflate the layout for this fragment

    splash()
    rootview = inflater.inflate(R.layout.fragment_splash, container, false)

    return rootview
}

fun splash(){
    Thread(Runnable {
        Thread.sleep(500)
        findNavController().navigate(R.id.action_splahFragment_to_loginFragment)
    }).start()
}

}

android kotlin android-jetpack android-jetpack-navigation
4个回答
1
投票

Thread.sleep(time) 冻结 UI。所以使用Handler来延迟启动。

更新您的启动功能:

fun splash(){
     Handler(Looper.getMainLooper()).postDelayed(Runnable {
        findNavController().navigate(R.id.action_splahFragment_to_loginFragment)
    }, 500)
}

0
投票

你的解决方案很好,但它不安全,当你调用

Thread
时它无论如何都会产生一个新的
start
并且
thread
sleep
到目前为止一切都很好,但你需要从 UI 调用
navController
线程,如果用户在
500
毫秒之前退出应用程序,它也会崩溃。

这是一个解决方案

Kotlin coroutines
方式

val mDelayJob: CompletableJob = Job() 
//use mDelayJob to cancel coroutine in onStop, so if even user exits before delay, nothing will happen
fun splash(){
    CoroutineScope(Dispatchers.Main).launch(mDelayJob){
        delay(500)
        findNavController().navigate(R.id.action_splahFragment_to_loginFragment)
    }
}

0
投票

目前看起来很安全,因为您只在胎面上休眠了 500 毫秒。但万一以后增加睡眠时间就不安全了。

让我解释一下,假设您正在休眠一个线程 10000 mills(即 10 秒),并且在 10 秒之前如果您导航到任何其他组件(例如片段或活动),那么在 10 秒之后,当您的线程尝试执行下一个时线,该片段将不可见并且会导致问题。

因此,作为最佳实践,您可以在片段的

onStop
方法上中断线程,并仔细检查可运行内部,即您的线程是否中断。如果没有被中断,则只执行接下来的任务


0
投票

不,这不安全。有一个 API 可以执行此类任务。看看 https://developer.android.com/develop/ui/views/launch/splash-screen

这是在 XML 中实现闪屏的正确方法。

© www.soinside.com 2019 - 2024. All rights reserved.