简体   繁体   English

处理程序 postDelay 只工作一次

[英]Handler postDelay works only once

I'm trying to change delay of handler in handler.postDelay() but here it works only once then it stops.我正在尝试在handler.postDelay()更改处理程序的延迟,但在这里它只工作一次然后停止。 The crucial method is in the end.关键的方法在最后。 I'm thinking how I can make the runnable work in loop of postDelay().我在想如何在 postDelay() 循环中使可运行的工作。

class MyGestureListener implements GestureDetector.OnGestureListener {
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        column = (int) (e.getX() / cellWidth);
        row = (int) (e.getY() / cellHeight);
        selectedNode = (6 * row) + column;


        if (selectedNode == enemyNode && !atak && GameMovingObject.ableToAttack(chibiAlive, enemyAlive, chibiNode, enemyNode)) {

            if (attackOption) {
                chibi1.attack(enemies.get(enemyId));
                //attackOption=false;
                atak = true;

                if (!enemyAlive) {
                    enemyId = enemyId + 1;
                    enemies.add(new Enemy(enemyId, GameSurface.this, wolf, Enemy.genPosition(getWidth(), getHeight())[0], Enemy.genPosition(getWidth(), getHeight())[1], cellWidth, cellHeight));
                    enemyAlive = true;
                }
            }
        }

        // ...
        return true;
    }
}

relevant methods相关方法

public static boolean ableToAttack(boolean chibiAlive, boolean enemyAlive, int chibiNode, int enemyNode) {
    if(!chibiAlive || !enemyAlive)
        return false;

    boolean able = false;
    if (chibiNode > enemyNode)
        if (chibiNode - enemyNode == 1 || chibiNode - enemyNode == 5 || chibiNode - enemyNode == 6 || chibiNode - enemyNode == 7)
            able = true;
    if (enemyNode > chibiNode)
        able = enemyNode - chibiNode == 1 || enemyNode - chibiNode == 5 || enemyNode - chibiNode == 6 || enemyNode - chibiNode == 7;
    return able;
}

and

public void attack(Enemy enemy) {
    if (partOfBody.equals("legs"))
        enemy.getLegsDamage(generateDamage());

    if (enemy.hp <= 0) {
        enemy.hp = 0;
        gs.attackOption = false;
        gs.setEnemyAlive(false);
        addExperience();
        dbHelper.setExp("1", exp);
        // ...
    }
}

and finally最后

public void getLegsDamage(int legsDamage) {
    fullLegsDamage = fullLegsDamage + legsDamage;
    hp = hp - legsDamage;
    if(fullLegsDamage>50) {
        legsDamaged=2;
        handler2.removeCallbacksAndMessages(null);
        handler2.postDelayed(runnable, 4000);
    }
}

runnable looks like this runnable 看起来像这样

runnable = new Runnable() {
    @Override
    public void run() {

        hit=true;
        //gs.canvas.drawBitmap(bitmap,200,200, null);
        cc.setHp(cc.getHp() - generateDamage());
        if(cc.getHp() <= 0) {
            cc.setHp(0);
            gs.setChibiAlive(false);
        }
        ((Gra)gs.getContext()).updateChibiHpMp(cc);
    }
};

I've been thinking about this for whole day up until now.直到现在,我一整天都在思考这个问题。 Help me please.请帮帮我。

Not completely sure what you are asking for but I interpret the question as you want the Runnable to run every 4s and in that case the Runnable needs to post it self at before it's done, like this:不完全确定您要的是什么,但我将问题解释为您希望Runnable每 4 秒运行一次,在这种情况下, Runnable需要在完成之前自行发布,如下所示:

runnable = new Runnable() {
    @Override
    public void run() {
        hit=true;
        //gs.canvas.drawBitmap(bitmap,200,200, null);
        cc.setHp(cc.getHp() - generateDamage());
        if(cc.getHp() <= 0) {
            cc.setHp(0);
            gs.setChibiAlive(false);
        }
        ((Gra)gs.getContext()).updateChibiHpMp(cc);

        // Schedule the runnable again
        handler2.postDelayed(this, 4000)
    }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM