我有一个方法,我将TextView作为“loading ...”指示器。
我使用Runnable执行此操作,每隔0.5秒更新一次TextView。这是我的功能:
public void displayFlash() {
animate = true;
Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
while(animate) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
public void run() {
System.out.println("Running");
numFrames++;
switch (numFrames % 3) {
case 0:
loading.setText("Loading.");
break;
case 1:
loading.setText("Loading..");
break;
case 2:
loading.setText("Loading...");
break;
}
}
});
}
}
};
new Thread(runnable).start();
}
问题是,在此活动完成(并销毁)之后,线程继续运行。我在Runnable中有一个System.out.println("running");
,并且在此活动完成后会继续记录。我需要做些什么来杀死它?我试过handler.removeCallbacks(runnable);
和Thread.interrupt();
没有运气。
答案 0 :(得分:4)
public void displayFlash() {
animate = true;
final Handler handler = new Handler();
Runnable yourRunnable = new Runnable() {
@Override
public void run() {
System.out.println("Running");
numFrames++;
switch (numFrames % 3) {
case 0:
loading.setText("Loading.");
break;
case 1:
loading.setText("Loading..");
break;
case 2:
loading.setText("Loading...");
break;
}
handler.postDelayed(this, 500);
}
}
handler.post(yourRunnable);
}
完成后,请致电handler.removeCallbacks(yourRunnable);
答案 1 :(得分:0)
如何使用AsyncTask abbout?它是一个与活动绑定的类,它允许您覆盖4个方法,一个执行后台作业,另一个直接与活动通信。据我所知,它在Activity被解除后自动停止工作,但是,如果我对此非常不对,你总是可以调用AsyncTask.cancel()方法在Activity.onPause()方法中停止它。它不是传统的解决方案,因为AsyncTask通常用于短任务,但可以工作。如果您认为该类可以执行该操作,请参阅Android开发人员以获取文档。