我正在制作一个简单的游戏来学习如何使用Android Studio。游戏的目标是尽可能快地完成一些简单的任务。在我的主游戏屏幕中,我设置了一个线程,让int每秒钟计数一次,这样玩家就知道过去了多少时间。当玩家完成所有简单任务后,游戏就会进入结束界面。现在我想在结束屏幕中显示时间,这样玩家就知道他们完成的速度有多快。当我运行游戏时,我得到一个错误。
这是每秒运行一个线程的代码:
Timer d = new Timer(true);
thread1 thread1 = new thread1(this, myCanvas);
t.scheduleAtFixedRate(thread1, 0, 1000);
这是线程每秒执行的tick函数:
public void tick1(){
timer++;
}
这是计时器的getter:
public int getTimer(){
return timer;
}
当游戏结束并进入结束屏幕时,我使用getTimer()来拥有一个应该显示计时器的textview:
err = (TextView)findViewById(R.id.textView);
err.setText("Tijd: "+ timer+"");
这是我尝试运行它时得到的错误信息:
2021-03-06 11:18:38.153 21729-21729/com.example.test_game E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.test_game, PID: 21729
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test_game/com.example.test_game.Eindscherm}: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.test_game.MyCanvas.getTimer()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3792)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8506)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.test_game.MyCanvas.getTimer()' on a null object reference
at com.example.test_game.Eindscherm.onCreate(Eindscherm.java:24)
at android.app.Activity.performCreate(Activity.java:8198)
at android.app.Activity.performCreate(Activity.java:8182)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3765)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8506)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
误差
我认为当你在结束活动时,你正在调用getTimer()
方法,该方法在另一个活动中。
所以你不能在活动中这样做。因为活动与JAVA类不同。
你所需要做的就是传递数据到结束活动。别担心,这很简单,我会告诉你怎么做。
在第一个活动:
FirstAcitivity {
// when you want to go to SecondActivity
Intent i = new Intent(context, SecondActivity.class)
//passing the data by Intent
i.putExtra("ex1", yourIntegenr);
}
在第二个活动:
SecondActivity{
//checking the Intent has valid data
if (getIntent().getExtras() != null) {
//getting the data from Intent
int time = getIntent().getExtras().getSerializable("ex1");
yourTextView.setText(time.toString());
}
}