簡體   English   中英

在Android中使用處理程序時如何停止線程?

[英]How to Stop a Thread when Using Handler in Android?

我要制作幾張在單擊時將由Handler更改的圖像。 但是現在只有兩個圖像可以進行測試。 我想通過單擊兩個過程來更改圖像。 再次單擊圖像后,應該停止第一個過程。 但是,在我的代碼中,第一個過程不會停止。 我可以看到這兩個過程同時在起作用。

我如何才能停止第一個線程,並且在有許多線程在進行中時如何一個一個地管理?

這是下面的代碼。

    public class MainActivity extends AppCompatActivity {

    ImageView img;
    ImageView img2;
    ImageView img3;

    Button btn;
    Handler myHandler;
    Runnable myRun;
    int flag_number;

 int img1_phase = 0;

    //click method for image 1
    public void img1_click (View view) {
        flag_number = 1;
        click_change_Image(img, img1_phase);

        myRun = new Runnable() {
            @Override
            public void run() {
                time_change_image(img, img1_phase);
            }
        };
        new Thread(myRun).start();

        }
    }



//Click method for 2nd process
    public void click_change_Image(final ImageView imageView, int phase) {

        if (phase == 4 || phase == 5) {
            imageView.setImageResource(R.drawable.second_1);
            myHandler.removeCallbacksAndMessages(null); //this code doesn't work
            Thread.interrupted();// not work either
            phase = 7;
        }

        image_checker(phase);

        return;
    }



  //Change Image Process by Thread after Clicked
public void time_change_image(final ImageView imageView, int phase) {
        if (phase == 0) {
            change_Image(imageView, R.drawable.new_one_1, 300);
            phase = 1;
            image_checker(phase);

            change_Image(imageView, R.drawable.new_one_2, 300);
            phase = 2;
            image_checker(phase);

            change_Image(imageView, R.drawable.first_1, 300);
            phase = 3;
            image_checker(phase);

            change_Image(imageView, R.drawable.first_2, 3000);
            phase = 4;
            image_checker(phase);

            change_Image(imageView, R.drawable.first_3, 3000);
            phase = 5;
            image_checker(phase);

            change_Image(imageView, R.drawable.first_4, 3000);
            phase = 6;
            image_checker(phase);

            change_Image(imageView, R.drawable.empty, 3000);
            phase = 0;
            image_checker(phase);

        }else if(phase == 7) {

            change_Image(imageView, R.drawable.second_2, 3000);
            phase = 8;
            image_checker(phase);

            change_Image(imageView, R.drawable.second_3, 3000);
            phase = 9;
            image_checker(phase);

            change_Image(imageView, R.drawable.second_4, 3000);
            phase = 10;
            image_checker(phase);

            change_Image(imageView, R.drawable.empty, 3000);
            phase = 0;
            image_checker(phase);

        }

        flag_number = 0;

    }



 //Change Image Resource method
    public void change_Image(final ImageView iv, final int image, int wait_time) {
            sleep_Thread(wait_time);
            myHandler.post(new Runnable() {
                @Override
                public void run() {
                    iv.setImageResource(image);
                }
            });
        }
    }

使用標志來管理您的線程。 例如:

boolean isRun = true (global variable)
   myRun = new Runnable() {
        @Override
        public void run() {
            if(isRun) {
               time_change_image(img, img1_phase);
            }
        }
    };

使用Handler以避免主線程延遲。

Handler mHandler = new Handler();

啟動線程:

 mHandler.post(Runnable);

要么

mHandler.postDelayed(Runnable, some delayTime)

停止

 mHandler.removeCallback(Runnable);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM