Android線程的建立與銷毀

來源:互聯網
上載者:User

標籤:android   des   style   blog   http   color   

摘要:

  在Android開發中經常會使用到線程,一想到線程,很多同學就立即使用new Thread(){...}.start()這樣的方式。這樣如果在一個Activity中多次調用上面的代碼,那麼將建立多個匿名線程,程式啟動並執行越久可能會越來越慢。因此,需要一個Handler來啟動一個線程,以及刪除一個線程,保證線程不會重複的建立。 

 

本文:

1、建立Handler的一般方式 

一般會使用Handler handler = new Handler(){...}建立。
這樣建立的handler是在主線程即UI線程下的Handler,即這個Handler是與UI線程下的預設Looper綁定的。
Looper是用於實現訊息佇列和訊息迴圈機制的。
因此,如果是預設建立Handler那麼如果線程是做一些耗時操作如網路擷取資料等操作,這樣建立Handler是不行的。

 

2、使用HandlerThread 

HandlerThread實際上就一個Thread,只不過它比普通的Thread多了一個Looper。
我們可以使用下面的例子建立Handler :

HandlerThread thread = new HandlerThread("MyHandlerThread"); thread.start(); mHandler = new Handler(thread.getLooper()); mHandler.post(mBackgroundRunnable); 

建立HandlerThread時要把它啟動了,即調用start()方法。
然後建立Handler時將HandlerThread中的looper對象傳入。
那麼這個mHandler對象就是與HandlerThread這個線程綁定了(這時就不再是與UI線程綁定了,這樣它處理耗時操作將不會阻塞UI)。
最後把實現耗時操作的線程post到mHandler的訊息佇列裡面。
注意的是,mBackgroundRunnable這個線程並沒有啟動,因為沒有調用start()方法。

完整demo:

public class MainActivity extends Activity implements OnClickListener{     public static final String TAG = "MainActivity";     private Handler mHandler;     private boolean mRunning = false;     private Button mBtn;         @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);                 HandlerThread thread = new HandlerThread("MyHandlerThread");         thread.start();//建立一個HandlerThread並啟動它         mHandler = new Handler(thread.getLooper());//使用HandlerThread的looper對象建立Handler,如果使用預設的構造方法,很有可能阻塞UI線程         mHandler.post(mBackgroundRunnable);//將線程post到Handler中         mBtn = (Button)findViewById(R.id.button);         mBtn.setOnClickListener(this);     }         @Override     protected void onResume() {         super.onResume();         mRunning = true;     }         @Override     protected void onStop() {         super.onStop();         mRunning = false;     }         @Override     public boolean onCreateOptionsMenu(Menu menu) {         // Inflate the menu; this adds items to the action bar if it is present.         getMenuInflater().inflate(R.menu.main, menu);         return true;     }         //實現耗時操作的線程     Runnable mBackgroundRunnable = new Runnable() {         @Override         public void run() {             //----------類比耗時的操作,開始---------------             while(mRunning){                 Log.i(TAG, "thread running!");                 try {                     Thread.sleep(200);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }             //----------類比耗時的操作,結束---------------         }     };         @Override     protected void onDestroy() {         super.onDestroy();         //銷毀線程         mHandler.removeCallbacks(mBackgroundRunnable);     }         @Override     public void onClick(View v) {         Toast.makeText(getApplication(), "click the button!!!", Toast.LENGTH_SHORT).show();     } } 

如果在onCreate()方法中裡面沒有使用HandlerThread而是在直接使用Handler的預設構造方法來建立Handler,那麼mBackgroundRunnable將會阻塞UI線程。

 

 3、線程銷毀 

用上面的方式來建立線程,在銷毀時就可以使用

mHandler.removeCallbacks(mBackgroundRunnable); 

銷毀一個線程,這樣就可以避免在多次進入同一個Activity時建立多個同時運行著的線程。

 

原文:

Android線程的建立與銷毀[2014-07-11](2013-06-19).http://www.bdqn.cn/news/201306/9538.shtml

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.