在我的应用程序中,我使用此线程在时钟上旋转秒针。但问题是当我关闭活动时,线程仍然保持运行。我想停止线程,因此它不会影响设备的Bettry。
下面是我的活动代码,我正在旋转时钟的秒针:
public class ClockActivity extends Activity implements OnClickListener{
private Button chimeBtn;
private ImageView img;
private Thread myThread = null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.clock_layout);
Runnable runnable = new CountDownRunner();
myThread = new Thread(runnable);
myThread.start();
chimeBtn = (Button) findViewById(R.id.chimeBtn);
chimeBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.chimeBtn:
playSound(R.raw.one_bell);
break;
}
}
public void playSound(int resources){
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resources);
mp.start();
}
private void doPlay(){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.v("log_tag", "this is seocond thread");
}
}).start();
}
public void doRotate() {
runOnUiThread(new Runnable() {
public void run() {
try {
Date dt = new Date();
int hours = dt.getHours();
int minutes = dt.getMinutes();
int seconds = dt.getSeconds();
String curTime = hours + ":" + minutes + "::" + seconds;
Log.v("log_tag", "Log is here Time is now" + curTime);
img = (ImageView) findViewById(R.id.imgsecond);
RotateAnimation rotateAnimation = new RotateAnimation((seconds - 1) * 6, seconds * 6,
Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setFillAfter(true);
img.startAnimation(rotateAnimation);
} catch (Exception e) {
Log.e("log_tag", "Error msg is " + e.toString());
}
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
System.out.println("Back Key Press");
if (myThread != null) {
myThread.interrupt(); //says that the myThread should stop
try{
myThread.join(); //make this myThread wait for the other myThread to finish before returning
myThread = new Thread();
myThread = null;
}catch(InterruptedException ie){
//handle the case if the thread.join is interrupt
//don't know if this will ever happen, if it can... throw a runtime exception?, or reinterrupt?
Thread.currentThread().interrupt();
// reinterrupt because thrown exception cleared interrupt and hope it's handled elsewhere
}
}
System.out.println("Back Key Press");
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onDestroy(){
System.out.println("OnDestroy");
super.onDestroy();
}
class CountDownRunner implements Runnable {
// @Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// Log.v("log_tag", "Roate is going");
doRotate();
Thread.sleep(1000);
//doPlay();
} catch (InterruptedException e)
{
// Thread.currentThread().interrupt();
} catch (Exception e) {
Log.e("log_tag", "Error is " + e.toString());
}
}
}
}
}
提前致谢。
答案 0 :(得分:5)
在您的活动中尝试此代码 -
@Override
protected void onDestroy() {
android.os.Process.killProcess(android.os.Process.myPid());
}
退出应用程序时,您的申请流程实际上并未销毁。如果你破坏你的进程,所有子进程(你所有的子线程)都将被销毁。
答案 1 :(得分:4)
好的,这意味着您要创建一个已在后台运行的服务。有一点是服务是一种类型的线程,如果它将在后台运行,将耗尽您的设备电池电量。所以,如果你杀了你的进程,那么线程和你的服务就会破坏。所以,停止你的线程 -
boolean running = true;
public void run() {
while(running) {
// your working code...
}
}
@Override
protected void onDestroy() {
running = false;
}
当您退出应用程序时,该主题将停止。而另一个将继续运行,这是你的服务。不要试图强行停止你的线程,或暂停。不推荐使用它,如果你的线程的while循环中断,那么它将根据JVM规则自动销毁你的线程。 希望它会对你有所帮助。 玩得开心......
答案 2 :(得分:3)
在UI线程上不要myThread.join()
,因为它会阻塞,直到线程完成,你的应用程序可能是ANR。此外Thread.currentThread().interrupt();
将尝试中断非常糟糕的UI线程。
您可以将MyThread.interrupt()
放入onDestroy
,onPause
或onStop
(+在相应的开始回调中重新创建主题)