Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.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 Android:尝试在两个动画之间添加等待,在等待之前获取未被线程锁定的对象()错误_Java_Android_Multithreading_Wait - Fatal编程技术网

Java Android:尝试在两个动画之间添加等待,在等待之前获取未被线程锁定的对象()错误

Java Android:尝试在两个动画之间添加等待,在等待之前获取未被线程锁定的对象()错误,java,android,multithreading,wait,Java,Android,Multithreading,Wait,我不熟悉Android和Java编程。我为Coursera课程创建了一个应用程序。它有两个重复出现的动画。我想让它们像鼓的拍子一样动起来-1,2,1,2,1,2,1,2,1,2 我编写了两个递归方法,在用户单击重置按钮之前一直运行。我尝试在方法调用之间添加一个等待,以便第二个方法调用将在第一个方法调用之后立即启动 这是我的代码中有等待的部分 mHandler = new Handler(); // .os package class when importing mLeftfoo

我不熟悉Android和Java编程。我为Coursera课程创建了一个应用程序。它有两个重复出现的动画。我想让它们像鼓的拍子一样动起来-1,2,1,2,1,2,1,2,1,2

我编写了两个递归方法,在用户单击重置按钮之前一直运行。我尝试在方法调用之间添加一个等待,以便第二个方法调用将在第一个方法调用之后立即启动

这是我的代码中有等待的部分

mHandler = new Handler(); // .os package class when importing
        mLeftfoot = findViewById(R.id.leftfoot);
        mRightfoot = findViewById(R.id.rightfoot);  
        mFootAnim = AnimationUtils.loadAnimation(this, R.anim.foot); //this looks to the foot.xml file for the animations
        leftstepRecursive();
        try {
            wait(600);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        rightstepRecursive();
这部分代码展示了递归方法,据我所知,这些方法可能编写得更好。很多干燥的

private void leftstepRecursive() {
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mLeftfoot.startAnimation(mFootAnim);
                if (!pleaseStop)
                    leftstepRecursive();
            }
        }, mIntervalleft);}

    private void rightstepRecursive() {
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mRightfoot.startAnimation(mFootAnim);
                    if (!pleaseStop)
                        rightstepRecursive();
                }
            }, mIntervalright);
有没有更好的方法来实现这个左,右,左,右,左,右,左,右,左,右,想法

或者,我能做些什么来纠正等待

我也试过:

private void rightstepRecursive() {
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    Object testobj = mRightfoot.startAnimation(mFootAnim);
                    synchronized (testobj) {
                        testobj.wait(600);
                    }
                    if (!pleaseStop)
                        rightstepRecursive();
                }
            }, mIntervalright);
@路易吉门多萨。我试着去睡觉。没有错误,但两个动画同时移动不确定原因

private void rightstepRecursive() {
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mRightfoot.startAnimation(mFootAnim);
                    if (!pleaseStop)
                        rightstepRecursive();
                }
            }, mIntervalright);

            try
            {
                Thread.sleep(500);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
}
我也在Logcat中重复了这个消息

02-11 12:15:32.261: I/Choreographer(30480): Skipped 302 frames!  The application may be doing too much work on its main thread.

您应该真正利用框架和它提供的一些类,例如s和s。动画框架提供了许多功能,可以真正简化您尝试执行的操作,即重复动画、添加延迟、计时动画等

下面是一个非常简单的示例,给出了基本的想法:

AnimatorSet animations;

//Play the animation
private void playAnimation(){       
    //If they haven't stopped the animation, loop it.
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(target, propertyName, values);
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(target, propertyName, values);
        animations = new AnimatorSet();
        animations.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                playAnimation();
            }
        });
        animations.play(anim1).before(anim2);
            animations.start();

}

//Called when cancel is selected
private void stopAnimation(){
    animations.end();
}

我不确定在这种情况下是否应该使用
wait
Thread.sleep
。请参阅上面的我的Thread.sleep…它不起作用。两个动画同时发生。我希望mRightfoot在mLeftfoot后500毫秒启动。请不要在问题标题前加上
Android
,底部的标签已经足够了。您不想使用
Thread.sleep()
wait
(需要同步,请参阅)。启动正确的方法不需要实际睡眠,只需使用相同的
处理程序
方法在调用左侧动画的行之后发布延迟消息(600毫秒后),在延迟的
可运行
中,只需调用要在600毫秒后启动的正确方法即可。Luksprog。谢谢好的,没有更多的Android前缀。你能发布你的代码示例吗。你的回答应该得到表扬。哦,我的意思是发布任何答案,而不是评论。你应该得到信用而不是被淹没。他/她的回答很有帮助,但不会直接用我发布的代码解决我当前的问题。谢谢,乍一看,处理程序/递归方法代码似乎更容易理解。在我的代码中,实际动画在foot.xml中,在那里很容易更改动画(滑动、不透明)。在代码中,在哪里处理实际动画?目标、propertyName、值?目标是对象,因此您的视图、propertyName是您正在制作的动画…因此,这可以是“x”或“y”等,而值是您的开始和结束值,或者只是结束值(如果您只指定一个值,则将其视为结束值)。这些都在文档中。另外,请注意,您也可以在xml中创建objectAnimators。不确定您是否仍在检查这一点,但我使用递归方法修复了其他方法。在您的示例中,我将在何处控制anim1和anim2之间的间隔/速度?通过设置自定义/不同的插值器,请参见设置插值器