在Activity開啟的子線程並不會自動隨Activity的destroy而關閉,所以必須手動去關閉子線程或者通過boolean的方式讓子線程結束運行。開啟的子線程有for循環的要更加注意。
1 package com.lsw; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Message; 7 import android.util.Log; 8 public class ThreadDemoActivity extends Activity { 9 private static final String TAG = "ThreadDemo"; 10 private int count = 0; 11 private Handler mHandler = new MyHandler(); 12 boolean stopThread=false; 13 14 private Runnable mRunnable = new Runnable() { 15 16 public void run() { 17 18 while (!stopThread) 19 { 20 count++; 21 try 22 { 23 Thread.sleep(2000); 24 } 25 catch (InterruptedException e) 26 { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 31 //雖然Message的構造函數是public的,但是最好是使用Message.obtain( )或Handler.obtainMessage( )函數來獲取Message對象,因為Message的實現中包含了回收再利用的機制,可以提供效率。 32 Message message=mHandler.obtainMessage(); 33 message.what=0; 34 message.obj=count; 35 mHandler.sendMessage(message); 36 } 37 } 38 }; 39 40 @Override 41 public void onCreate(Bundle savedInstanceState) { 42 super.onCreate(savedInstanceState); 43 setContentView(R.layout.main); 44 //開啟子線程 45 new Thread(mRunnable).start(); 46 } 47 48 protected void onDestroy() { 49 System.out.println("-----------onDestroy------"); 50 stopThread=true; 51 super.onDestroy(); 52 }; 53 54 class MyHandler extends Handler{ 55 56 @Override 57 public void handleMessage(Message msg) 58 { 59 // TODO Auto-generated method stub 60 Log.e(TAG, Thread.currentThread().getName() + " " +msg.obj); 61 setTitle("" +msg.obj); 62 } 63 } 64 65 }