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

4

在我的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

但在某些条件下,我希望停止它的运行,即在它已经启动后停止。这是我的活动的完整代码:

    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();

        }



    }

我怎样修改代码,使得我的RunnableonClick()方法的else条件中停止运行?


3
可能是 Android:如何停止 Runnable? 的重复问题。 - patryk.beza
@patryk.beza 这不是这个问题的重复。请查看已接受的答案。我会尝试编辑问题,以便更清楚地表达所要求的内容。 - Dan Getz
3个回答

4
您可以尝试移除回调函数。
imgview.removeCallbacks(r);

为了使这个工作正常,您需要确保r与您发布的Runnable相同。您可以在onCreate中创建它一次。由于Runnable不依赖于ClickListener,因此这不应该是一个问题。
现在我想到了,您可能还需要进行一些同步,以防止删除当前正在运行的回调的情况发生。然而,使用volatile boolean running的想法可能总体上更简单。

2

您可以通过一个布尔标志控制run()方法:

boolean running = true;
 ...

r = new Runnable()
{
         public void run() 
         {
             if(running)
             {
                 imgview.setImageResource(imageArray[i]);
                 i++;
                 if (i >= imageArray.length) {
                     i = 0;
                 }
                 imgview.postDelayed(r, 20); 
             }
         };
}

如果你稍后设置running = false,那么你的线程将处于空闲状态,这正是你想要的。

1
while循环无法停止亲爱的 - Amit Prajapati
@AmitPrajapati 不是循环条件,而是if条件。我已经有一段时间没有编辑我的答案了。 - Juvanis
我想使用“running false”。 - Amit Prajapati
你能告诉我当我需要重新启动这个Runnable时,我想要做什么吗? - Amit Prajapati
@AmitPrajapati 如果你设置 running = true 线程将继续运行。 - Juvanis

-3

你可以通过以下方式来实现:

         Thread.stop();

2
不可以。请参考:Java线程文档 - nkr
1
除了Thread.stop()已废弃这一事实,还有哪个线程需要停止? - cHao
(1)Thread是一个类。你不能只调用Thread.stop()stop不是静态的,因此需要一个实例。而你没有这样的引用。你可以在Runnable中使用Thread.currentThread()来获取这样的引用,但是(2)被停止的线程不是当前线程;否则,你可以直接返回。 - cHao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接