问题描述
首先,我实际上是android开发的新手。
我一直在尝试构建一个简单的游戏,玩家必须在时间用完之前执行一次动作(用进度条表示)。 如果玩家成功执行该行为,则他或她会获得更多时间。
进度条的清空是通过可运行的(参见下文)完成的
final ProgressBar time = (ProgressBar) findViewById(R.id.time_left);
final Runnable timer = new Runnable() {
@Override
public void run() {
time.setProgress(time.getProgress() - 4);
int ProgressRemaining = time.getProgress();
if (ProgressRemaining == 0) {
h.removeCallbacks(null);
YouLose();
}
h.postDelayed(this, 10);
}
};
(介于两者之间的代码)
public void YouLose() {
Intent i = new Intent(this, youLose.class);
startActivity(i);
finish();
}
在每个循环中,可运行程序都会检查进度条是否为零。 问题是我希望应用程序在玩家到达该点后开始新的活动,我学到了很难的方法,即以这种方式开始新的活动会导致巨大的滞后和/或崩溃。
播放器时间用完了,有人可以帮助我如何开始新的活动吗? (我知道我做过一些愚蠢的事,不要害怕告诉我应该如何真正地执行此类操作。)
先感谢您
1楼
我建议使用一个名为EventBus
的程序。
当ProgressRemaining为0时,您可以像这样调用一个简单而快速的EventBus方法。
EventBus.getDefault().post(progressRemaining);
...并且在您的Activity或base Activity中有一个简单的接收方法,如下所示;
@SuppressWarnings("unused")
public void onEventMainThread(int progressRemaining){
youLose();
}
这样做可以弥合背景线程和前景线程之间的差距。
您的Application类中需要进行少量的其他设置,但这全部记录在其GitHub页面上。
我还建议您创建一个名为ProgressReachedZeroEvent
类的空事件类,并将其传递到EventBus
帖子中,而不要传递回int,这样您就可以更好地控制哪个事件读取您的帖子(如果您的应用程序中有其他onEvent,在将来。
另外,您应该以小写字母开头您的方法和变量。 仅类别名称应以大写字母开头。
编辑 :从重新阅读您的问题,看来您不是在尝试从后台线程启动Activity
。
因此,请忽略我已回答的内容。
看来您为开始一个新的Activity
所做的一切都很好,能否详细说明自己的经历?
滞后可能是其他原因造成的,而不是您开始下一个Activity
。
如果您每次都崩溃。
确保已在AndroidManifest.xml
文件中声明了新的Activity
。
发布崩溃报告将帮助您更快地解决问题。
我建议这样做:
Timer timer;
private void setup() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// your code goes here
);
}
},0,1000); // update every second
}
...并停止Timer
:
if (timer != null) {
timer.cancel();
timer = null;
}