gpt4 book ai didi

java - 如何在使用 postDelayed() 循环的 Android 中停止 Runnable?

转载 作者:太空狗 更新时间:2023-10-29 13:32:46 24 4
gpt4 key购买 nike

当在我的 Android 应用程序中单击图像时,我需要停止 Runnable 运行。我正在使用 ImageView.postDelayed() 重复运行此 Runnable:

r = new Runnable() {
public void run() {
imgview.setImageResource(imageArray[i]);
i++;
if (i >= imageArray.length) {
i = 0;
}
imgview.postDelayed(r, 20); // set to go off again in 3 seconds.
// imgview.setOnClickListener(this);
}

};
imgview.postDelayed(r, 20); // set first time for 3 seconds

但在某些情况下,我想在它已经启动后停止运行。这是我的 Activity 的完整代码:

    public class MainActivity extends Activity  {

int i = 0;

ImageView imgview, imgview2;
Handler handler = new Handler();
Runnable r;
MediaPlayer mMediaPlayer;
int[] imageArray = { R.drawable.f1, R.drawable.f2, R.drawable.f3,
R.drawable.f4, R.drawable.f5, R.drawable.f6, R.drawable.f7,
R.drawable.f8, R.drawable.f9, R.drawable.f10, R.drawable.f11,
R.drawable.f12, R.drawable.f13, R.drawable.f14, R.drawable.f15,
R.drawable.f16, R.drawable.f17, R.drawable.f18, R.drawable.f19,
R.drawable.f20, R.drawable.f21, R.drawable.f22, R.drawable.f23,
R.drawable.f24, R.drawable.f25, R.drawable.f26, R.drawable.f27,
R.drawable.f28 };

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tapp_activity);

imgview = (ImageView) findViewById(R.id.imageView1);

mMediaPlayer = new MediaPlayer();
mMediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.water);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);



imgview2 = (ImageView) findViewById(R.id.imageView2);

imgview2.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub




if(i==0)
{
mMediaPlayer.setLooping(true);
mMediaPlayer.start();
i=1;
r = new Runnable() {
public void run() {
imgview.setImageResource(imageArray[i]);
i++;
if (i >= imageArray.length) {
i = 0;
}
imgview.postDelayed(r, 20); // set to go off again in 3 seconds.
// imgview.setOnClickListener(this);
}

};
imgview.postDelayed(r, 20); // set first time for 3 seconds
}
else
{
i=0;

mMediaPlayer.stop();
imgview.setBackgroundResource(R.drawable.tapstill);
}



}
});


}


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mMediaPlayer.stop();

}



}

我可以在我的代码中更改什么,以便我的 Runnable 在我的 onClick() 方法的 else 条件下停止运行?

最佳答案

您可以尝试删除回调。

imgview.removeCallbacks(r);

不过,为了让它工作。您必须确保 r 与您发布的 Runnable 相同。您可以通过创建它一次来完成此操作,可能在 onCreate 中。由于 Runnable 无论如何都不依赖于 ClickListener,所以这应该不是问题。

您可能还需要进行一些同步,以防止您删除当前正在运行的回调的情况,不过,现在我想到了这一点。 volatile boolean running 想法总体上可能不那么复杂。

关于java - 如何在使用 postDelayed() 循环的 Android 中停止 Runnable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13723874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com