在Kotlin中使用Handler类会使我的Android应用程序崩溃

问题描述 投票:-3回答:2

当我从Handler类调用方法时,我的应用无法在模拟器中打开。我尝试注释掉代码的处理程序部分,然后应用正常启动。我需要帮助找到代码或其他地方的错误。我是初学者,所以我正在构建一些基本的东西,一个可运行的东西,应该使图片在屏幕的随机部分可见,这是方法:

fun goKenny(){

    runnable = object : Runnable{
        override fun run() {

            for (kenny in kennyList){
                kenny.visibility = View.INVISIBLE
            }

            var random = Random(8 - 0)
            var randomIndex = random.nextInt()

            kennyList[randomIndex].visibility = View.INVISIBLE

            handler.postDelayed(runnable,300)

        }

    }
    handler.post(runnable)

}

这是我的其余代码:

class MainActivity : AppCompatActivity() {


    private var handler : Handler = Handler()
    private var runnable : Runnable = Runnable {  }
    private var kennyList = tableLayout.children.toList()


    var score = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val sharedPreferences =
        this.getSharedPreferences("com.example.kennygame", android.content.Context.MODE_PRIVATE)

        //sharedPreferences.edit().putInt("High Score",score).apply();

        goKenny()

        object : CountDownTimer(10000, 1000) {
            override fun onFinish() {
                Toast.makeText(applicationContext, "Time's Up", Toast.LENGTH_LONG).show()
                timeView.text = "TIME'S UP"

                var highScore = sharedPreferences.getInt("High Score", 0)


                val sendHighScore = Intent(applicationContext, Main2Activity::class.java)

                sendHighScore.putExtra("Score", score)
                startActivity(sendHighScore)

            }

            override fun onTick(millisUntilFinished: Long) {
                timeView.text = "TIME: " + millisUntilFinished / 1000
            }


        }.start()


    }
}

错误跟踪:

2019-12-12 04:35:48.911 8789-8789/? I/zygote: Not late-enabling -Xcheck:jni (already on)
2019-12-12 04:35:48.937 8789-8789/? W/zygote: Unexpected CPU variant for X86 using defaults: x86
2019-12-12 04:35:49.305 8789-8789/com.example.kennygame D/AndroidRuntime: Shutting down VM
2019-12-12 04:35:49.310 8789-8789/com.example.kennygame E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.kennygame, PID: 8789
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.kennygame/com.example.kennygame.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2718)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:152)
        at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)
        at android.content.Context.obtainStyledAttributes(Context.java:655)
        at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:692)
        at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:659)
        at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:479)
        at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:214)
        at com.example.kennygame.MainActivity._$_findCachedViewById(Unknown Source:25)
        at com.example.kennygame.MainActivity.<init>(MainActivity.kt:22)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1173)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2708)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

感谢您的帮助

android kotlin handler
2个回答
0
投票

尝试这样的安全呼叫

handler?.post(runnable)

更新1:

看起来问题出在哪里,您试图设置视图的可见性。您正在获取空对象引用。

要验证,请尝试注释kenny.visibility = View.INVISIBLEkennyList[randomIndex].visibility = View.INVISIBLE。发表评论后应该可以成功运行。

更新2:

您在从kennyList派生的for循环中使用tableLayout。请尝试注释“ for”循环,并让我知道它是否在运行。


0
投票

问题在于处理程序初始化。如果要使用no-arg构造函数构造处理程序,则必须在活动的后期进行。延迟初始化将是一个简单且最佳的解决方案。

像这样更改处理程序的初始化

private val handler : Handler by lazy { Handler() }

NOTE:还要检查是否为视图设置了正确的可见性,因为您同时在for循环after for循环中都设置了View.INVISIBLE 这是多余的,或者您在这里做错了。

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