[英]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.