3

RunnableAndroidアプリで画像がクリックされたときに、の実行を停止する必要があります。私はこれRunnableを繰り返し使用していImageView.postDelayed()ます:

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

        }



    }

メソッドの条件でRunnable実行を停止するようにコードを変更するにはどうすればよいですか?elseonClick()

4

3 に答える 3

4

コールバックを削除してみてください。

imgview.removeCallbacks(r);

ただし、これが機能するためには。投稿したものrと同じであることを確認する必要があります。Runnableこれは、おそらくで一度作成することで実行できますonCreateRunnableとにかくに依存関係がないのでClickListener、これは問題にはならないはずです。

ただし、現在実行中のコールバックを削除する場合を防ぐために、同期を行う必要がある場合もあります。volatile boolean runningアイデアはおそらく全体的にそれほど複雑ではありません。

于 2012-12-05T17:42:23.273 に答える
1

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すると、スレッドはアイドル状態になり、それが必要になります。

于 2012-12-05T13:09:11.690 に答える
-3

あなたはそれを行うことができます

         Thread.stop();
于 2012-12-05T13:05:36.547 に答える