Android Java Runnable,当满足runnable中的条件时,如何打开另一个活动?

时间:2015-10-19 10:38:15

标签: java android multithreading

首先,我对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检查进度条是否达到零。问题是我希望应用程序在玩家达到这一点后开始一项新的活动,我学到了以这种方式开始新活动的艰难方式会导致巨大的延迟和/或崩溃。

有人可以帮助我如何在玩家用完时启动新活动吗? (我知道我做了一些愚蠢的事,不要害怕告诉我这样的事情应该怎么做。)

提前谢谢

1 个答案:

答案 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;
 }