Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,如何让代码在一定时间后运行_Java_Android_Android Studio - Fatal编程技术网

在java中,如何让代码在一定时间后运行

在java中,如何让代码在一定时间后运行,java,android,android-studio,Java,Android,Android Studio,你好,我先发了我的代码。我想在这里做的是在黑板上画导弹,但不是同时画所有导弹,然后在x毫秒/微秒后分别画。无论如何,这个代码不起作用,我不明白为什么 Kees您的条件是错误的,您希望当到达代码的这一部分时,您的nanotime正好等于“1000000”,这将是非常幸运的。您应该使用>= 你确定你的循环应该如何工作吗?你无法控制它循环的速度(好吧,不是那样的,这不应该是你的目标),这里的每一个循环你都会失去一枚可能发射的导弹。例如,可以从以下内容开始: @Override protecte

你好,我先发了我的代码。我想在这里做的是在黑板上画导弹,但不是同时画所有导弹,然后在x毫秒/微秒后分别画。无论如何,这个代码不起作用,我不明白为什么


Kees

您的条件是错误的,您希望当到达代码的这一部分时,您的nanotime正好等于“1000000”,这将是非常幸运的。您应该使用>=

你确定你的循环应该如何工作吗?你无法控制它循环的速度(好吧,不是那样的,这不应该是你的目标),这里的每一个循环你都会失去一枚可能发射的导弹。例如,可以从以下内容开始:

    @Override
protected void onDraw(Canvas canvas) {
    //Drawing the background and sprites as it is a blackboard.
    canvas.drawBitmap(scaledbmp, 0, 0, null);
    sprite.onDraw(canvas);
    boolean new_missle = true;
    missileStartTime = System.nanoTime();

    for (int i = missleslist.size() - 1; i >= 0; i--) {
        if (new_missle) {
            missleslist.get(i).onDraw(canvas);
            new_missle = false;
        }
        if (!new_missle && (missileStartTime - System.nanoTime()) == 1000000){
            new_missle = true;
            missileStartTime = System.nanoTime();
        }
    }
}

正如其他人已经指出了您现有代码中存在的一些问题,我不会在这里重复这些问题

因为您在问题中添加了(错误的)标记,并且您使用的是
View#onDraw(Canvas)
,所以我假设您谈论的是Android

您应该使用Android类,特别是
处理程序35; postDelayed(int)
方法来延迟稍后执行的代码:

//as long as you have missiles, it'll try to fire
while(missleslist.size() > 0) {
    if (System.nanoTime() - missileStartTime  >= 1000000){
        missleslist.get(0).onDraw(canvas);
        missleslist.remove(0);
        missileStartTime = System.nanoTime();
    }
}
@覆盖
受保护的void onDraw(画布){
//将背景和精灵绘制为黑板。
drawBitmap(scaledbmp,0,0,null);
雪碧(帆布);
StartDrawing飞弹(画布,导弹列表,0);
}
私有void startDrawing飞弹(画布、列表、导弹列表、,
int(当前索引){
if(currentIndex}, 1000000);//我从来没有使用过这个平台……但是你不能让你的程序休眠x秒,然后在它醒来时画图……然后再休眠,然后再唤醒等等……你几乎永远不会得到100万纳秒的差。每次循环迭代的运行时都会有一些变化,你会从9999999->1000,001并且从不触发if(),因为你没有击中那一个神奇的时差。它应该是
=
,而不是
=
。什么不起作用?你能提供一些细节吗?请检查你的第二个if语句的条件:使用==运算符正确吗?将它改为
=
1000000,而不是
=
@StefanFreitag This program应该从arraylist中绘制精灵,但要等一段时间才能绘制列表中的下一个元素。现在它只绘制一个元素,应该绘制三个元素,时间间隔为3。是的,我也这么认为,循环确实不起作用……我会尝试这个:)有一个输入错误,但应该是Systems.nanoTime()-missionstartime由于实际时间将大于旧时间,修复了无限循环hmmmmm,我有完全相同的问题:导弹不会发射
@Override
protected void onDraw(Canvas canvas) {
    //Drawing the background and sprites as it is a blackboard.
    canvas.drawBitmap(scaledbmp, 0, 0, null);
    sprite.onDraw(canvas);

    startDrawingMissiles(canvas, missileList, 0);
}

private void startDrawingMissiles(Canvas canvas, List<Missiles> missileList, 
                                  int currentIndex) {

    if (currentIndex < missileList.size()) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() { 
            public void run() { 
                missileList.get(currentIndex).onDraw(canvas);
                startDrawingMissiles(canvas, missileList, ++currentIndex);
            } 
        }, 1000000); // <- Your duration 
    }
}