无法运行x次函数

时间:2017-12-22 13:02:07

标签: java android

我正在尝试运行一个函数来移动imageView x次。这是一个步行动画。

public void doWalk() {
    String mDrawableName = buddy.leraar.naam;
    if (buddy.gezondheid < 30)
    {
        mDrawableName += "_dik_lopen";
    }
    else if (buddy.gezondheid > 85)
    {
        mDrawableName += "_dun_lopen";
    }
    else {
        mDrawableName += "_medium_lopen";
    }
    int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
    imageView.setImageResource(resID);
    Timer timer = new Timer();

    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            executeWalk(rnd.nextInt(1));
        };
    };
    timer.schedule(timerTask, 300);
}


public void executeWalk(int left) {
    if (rolls < 10)
    {
        rolls++;
        if (left == 0)
        {
            imageView.setX(imageView.getLeft() - 10);
        }
        else {
            imageView.setX(imageView.getLeft() + 10);
        }
    }
}

由于某种原因,executeWalk函数似乎只被调用一次,而它应该每300毫秒运行一次。即使看了很多不同的例子,我也不知道我做错了什么。

4 个答案:

答案 0 :(得分:3)

尝试使用schedule (TimerTask task, long delay, long period)。问题是你只能延迟300ms启动你的功能一次。

timer.schedule(timerTask, 0, 300);

答案 1 :(得分:2)

根据this,您使用的计划重载是layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoord; out vec2 TexCoord; uniform mat4 MVP; void main() { gl_Position = MVP * vec4(aPos, 1.0); TexCoord = aTexCoord; } ,因此您只是推迟执行任务但不定期执行任务。您应该使用void schedule(TimerTask task, long delay)来安排定时器定期执行某些操作。

所以它应该是这样的:

void schedule(TimerTask task, long delay, long period)

答案 2 :(得分:1)

timer.schedule(timerTask, 300);只运行一次任务,任务将在300毫秒内运行。

要重复执行,您必须使用:

void schedule (TimerTask task, Date firstTime, long period)

期间是执行之间的延迟。

timer.schedule(timerTask, 300, 100);将在300毫秒内第一次运行任务,之后任务将每100毫秒启动一次。

答案 3 :(得分:0)

你也可以使用AsyncTask。 在同一活动类中扩展AsyncTask(使imageview成为类变量)

public class MoveTask extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... voids)
    {
        while(1) {
            delay(300);
            publishProgress();
        }
    }

    @Override
    protected void onProgressUpdate(Void... voids)
    {
        //Move the imageview here
        executeWalk(rnd.nextInt(1));
    }
}

然后在doWalk()中创建一个实例并执行AsyncTask:

MoveTask moveTask=new MoveTask();
MoveTask.execute();