当我从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)
感谢您的帮助
尝试这样的安全呼叫
handler?.post(runnable)
更新1:
看起来问题出在哪里,您试图设置视图的可见性。您正在获取空对象引用。
要验证,请尝试注释kenny.visibility = View.INVISIBLE
和kennyList[randomIndex].visibility = View.INVISIBLE
。发表评论后应该可以成功运行。
更新2:
您在从kennyList
派生的for循环中使用tableLayout
。请尝试注释“ for”循环,并让我知道它是否在运行。
问题在于处理程序初始化。如果要使用no-arg构造函数构造处理程序,则必须在活动的后期进行。延迟初始化将是一个简单且最佳的解决方案。
像这样更改处理程序的初始化
private val handler : Handler by lazy { Handler() }
NOTE:还要检查是否为视图设置了正确的可见性,因为您同时在for循环和after for循环中都设置了View.INVISIBLE
这是多余的,或者您在这里做错了。