我已经检查了这篇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相结合?我会调查一下......
答案 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!瞧!