可运行的代码无法停止Android

时间:2017-06-01 02:51:15

标签: java android runnable

我已经检查了这篇SO帖子,但无济于事:removeCallbacks not stopping runnable

我的应用程序做了什么:我有2个imageViews。当app运行时,一个imageView应该将其图像从睡眠图像更改为唤醒图像然后再返回睡眠图像。然后处理程序用于延迟之前为第二个imageView做同样的事情。然后我想让Runnable停下来。我正在使用Android的帧动画。 请帮忙!

public class MainActivity extends Activity {

    AnimationDrawable[] animDrawList;
    ImageView im;
    ImageView im2;

    private int curPos;
    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        animDrawList = new AnimationDrawable[2];
        curPos = 0;

        im = (ImageView)findViewById(R.id.image1);
        im2 = (ImageView)findViewById(R.id.image2);

        im.setBackgroundResource(R.drawable.animation_to_run);
        im2.setBackgroundResource(R.drawable.animation_to_run);

        animDrawList[0] = (AnimationDrawable) im.getBackground();
        animDrawList[1] = (AnimationDrawable) im2.getBackground();

        mHandler = new Handler();

        startTask();
    }

    Runnable myThread = new Runnable() {

        volatile boolean stopMe = false;

        @Override
        public void run() {

            if ( curPos <= 1 ) {
                animDrawList[curPos].start();
                curPos++;
            }
            if ( curPos > 1 ) {
                stopMe = true;
            }

            if ( stopMe ) {
                stopTask();
                return;
            }

            mHandler.postDelayed(myThread, 1000);
        }
    };

    void startTask() { myThread.run();  }

    void stopTask() { mHandler.removeCallbacks(myThread); }

}//end of MainActivity class

这是我的布局文件,直截了当:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="org.example.a.MainActivity">

    <ImageView
        android:id="@+id/image1"
        android:layout_width="90px"
        android:layout_height="90px"
        android:layout_alignParentStart="true"
        android:layout_marginStart="14dp"
        android:layout_marginTop="13dp" />

    <ImageView
        android:id="@+id/image2"
        android:layout_width="90px"
        android:layout_height="90px"
        android:layout_marginEnd="49dp"
        android:layout_marginBottom="93dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

这是我的xml文件。

 <?xml version="1.0" encoding="utf-8"?>

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"

    android:oneshot="false">

    <item android:drawable="@drawable/restState" android:duration="1000" />
    <item android:drawable="@drawable/upState" android:duration="1000" />
    <item android:drawable="@drawable/restState" android:duration="1000" />

</animation-list>

应用程序运行,没有崩溃,但它不会停止。我希望Runnable在动画制作后停止,为什么不是我的旗帜“stopMe”做它的工作?

2017年6月4日更新:我删除了run方法中的动画代码,并在run方法中添加了logcat输出,Runnable确实以“stopMe”boolean停止,所以它是框架动画的问题,是我可以'将Android的帧动画与Runnable相结合?我会调查一下......

2 个答案:

答案 0 :(得分:1)

你只需要在run方法中添加一个条件

public void run() {
  while(!stopMe)
   {
    if ( curPos <= 1 ) {
        animDrawList[curPos].start();
        curPos++;
    }
     if ( curPos > 1 ) {
        stopMe = true;
    }

    if ( stopMe ) {
        stopTask();
        return;
    }

    mHandler.postDelayed(myThread, 1000);
  }
}

答案 1 :(得分:1)

我已经解决了!我不得不将AnimationDrawable对象的setOneShow(boolean playAnimationOncePerAnimationDrawableObject)设置为true!瞧!