Android UI主線程與子線程

  一個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();

進程

相關文章
相關標籤/搜索