Wie stoppe ich diesen Thread in Android?
In meiner Anwendung verwende ich diesen Thread, um den Sekundenzeiger auf der Uhr zu drehen. Aber das Problem ist, dass, während ich die Aktivität beende, der Thread immer noch ausgeführt wird. Ich möchte den Thread stoppen, damit er den Bettry des Geräts nicht beeinflussen kann.
Unten ist mein Aktivitätscode, bei dem ich den Sekundenzeiger der Uhr drehe:
<code> 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()); } } } } } </code>
Danke im Voraus.