首先,我对Android开发几乎全新。
我一直在尝试构建一个简单的游戏,玩家必须在时间用完之前执行操作(用进度条表示)。如果玩家成功地执行该行为,他或她将获得更多时间。
进度条的耗尽是通过runnable完成的(见下文)
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();
}
对于每个循环,runnable检查进度条是否达到零。问题是我希望应用程序在玩家达到这一点后开始一项新的活动,我学到了以这种方式开始新活动的艰难方式会导致巨大的延迟和/或崩溃。
有人可以帮助我如何在玩家用完时启动新活动吗? (我知道我做了一些愚蠢的事,不要害怕告诉我这样的事情应该怎么做。)
提前谢谢
答案 0 :(得分:0)
我建议使用名为EventBus
的程序。 https://github.com/greenrobot/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
的方式。如果你每次都遇到崩溃。确保您已在Activity
文件中声明了新的AndroidManifest.xml
。发布崩溃报告有助于更快地解决您的问题。
我建议改为:
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;
}