一個Android 程序默認狀況只有一個進程,可是一個進程能夠有多個線程。其中有一個UI 線程也稱爲UI主線程,UI Thread在Android程序運行的時候就被建立,主要是負責控制UI界面的顯示、更新和控件交互。全部的Android應用程序組件----包括Activity、Service、Broadcast Receiver都在應用程序的主線程中運行。所以,任何組件中的費時操做處理均可能阻塞全部其餘的組件、包括Service和可見的Activity。數據庫
在Android 中,對未響應的定義是:Activity對一個輸入事件在5s內沒有響應,或者Broadcast Receiver在10s內沒有完成他的onReceive處理程序。對於任何不用直接和用戶界面進行交互的重要處理,使用後臺線程技術處理是很是重要的,將文件操做、網絡交互、數據庫、複雜計算調度到後臺線程中完成很是重要,以避免阻塞主線程。網絡
方法一:Thread+Handler異步
開啓一個新線程:new Thread(new MyThread()).start();ide
//經過Handler物件,通知主線程UI Thread來更新界面 Handler myHandler=new Handler(){ //此方法主要用於更新UI public void handleMessage(Message msg){ switch(msg.what){ //根據Thread返回的標識進行相應的處理 } } }; class MyThread implements Runnable{ public void run(){ int what=0; //將耗時操做放到這裏處理 //to-do //將標識發給Handler myHandler.obtainMessage(what).sendToTarget(); } }
方法二:使用AsyncTask運行異步線程。spa
AsyncTask爲將耗時操做移到後臺線程並在操做完成後同步更新UI線程實現了最佳實踐模式。他有助於將事件處理程序與GUI線程進行同步,容許經過更新視圖和其餘UI元素來報告進度或者在任務完成後發佈結果。線程
要建立一個新的異步任務,須要擴展AsyncTask類,指定要使用的參數類型:code
public class MyAsyncTask extends AsyncTask { @Override protected Object doInBackground(Object... arg0) { // TODO Auto-generated method stub //將耗時操做放到此方法中來處理 return null; } @Override protected void onPostExecute(Object result) { // TODO Auto-generated method stub //更新UI,起到了handler的做用 } }
運行異步任務:blog
new MyAsyncTask().execute();
進程