Android中進程與線程及如何在子線程中操做UI線程

1. Android進程 android

一個應用程序被啓動時,系統默認建立執行一個叫作"main"的線程。這個線程也是你的應用與界面工具包(android.widget和android.view包中的組件)交互的地方。因而main線程也被稱爲界面線程。 數據庫

這種單線程的模式會帶來低性能,除非你能正確的優化你的程序。 安全

打 個比方:用戶觸摸屏幕上的一個按鈕時的點擊事件即向線程中派發事件,好比每個事件爲一輛車。而每一條線程都好像是一條單行線的單車道。這條車道上的車量 都排成隊行駛至收費口進行事件處理。當處理的事件繁瑣,好比在響應用戶交互時需執行大量運算,或者像是執行網絡鏈接、數據庫請求這樣耗時的操做。就會形成 擁堵,將會阻止整個界面的響應。當線程被阻塞時,就不能派發事件了。從用戶的角度看,程序反應太慢了。甚至更糟的是,若是界面線程被阻塞幾秒鐘(大5秒鐘 吧),用戶就戶抱怨說程序沒反應了,用戶可能於是退出並刪掉你的應用。 此外,Andoid界面不是線程安全的。因此你毫不能在一個工做線程中操做你的界面—你只能在界面線程中管理的你的界面。因此,對於單線程模式有兩個簡單 的規則 網絡

1不要阻塞界面線程 ide

2不要在界面線程以外操做界面。 工具

 

2. 工做線程 post

因爲上述的單線程模式,不要阻塞你的界面線程以使你的應用的界面保持響應是很是重要的,那麼若是你有不能很快完成的任務,你應把它們放在另外一個線程中執行(後臺線程或工做線程)。 性能

例如,下面是的代碼是響應click事件,在另一個線程中從網絡獲取資源文字並以TextView來顯示。 優化


mHandle.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {                        
                                              // 耗時操做           
                                                     loadNetWork();  
                    mTextView.setText(來自網絡的文字);                        
                    }
                });
                
            }
        }); this

第一眼,這看起來能很好的工做,由於它建立了一個新線程來進行網絡操做。然而它違反了第二條規則:不要在界面線程以外操做界面—它簡單的在工做線程中修改了mTextView。這會導至未定義的異常出現,而且難以調試追蹤。


爲了能改正這個問題,Android提供了不少從其它線程來操做界面的方法。下面是可用的方法們:

1 Activity.runOnUiThread(Runnable)

2 View.post(Runnable)

3 View.postDelayed(Runnable,long)

4 Handler

5 AsyncTask

如今咱們就依次使用這幾個方法:

一、Activity.runOnUiThread(Runnable)

mHandle.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        MainActivity.this.runOnUiThread(new Runnable() {
                                                   // 耗時操做           
                                                          loadNetWork();  
                        @Override
                            public void run() {
                                mTextView.setText(來自網絡的文字);            
                            }
                        });
                        
                    }
                });
                
            }
        });

二、 View.post(Runnable)

mHandle.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                                                     // 耗時操做           
                                                     loadNetWork();      
                        mTextView.post(new Runnable() {
                            
                            @Override
                            public void run() {
                                mTextView.setText(來自網絡的文字);    
                            }
                        });
                        
                    }
                });
                    
                
                
            }
        });

三、View.postDelayed(Runnable,long)

mHandle.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                                                     // 耗時操做           
                                                     loadNetWork();  
                        mTextView.postDelayed(new Runnable() {
                            
                            @Override
                            public void run() {
                                mTextView.setText(來自網絡的文字);                                
                            }
                        }, 10);
                        
                    }
                });
                
                
            }
        });

四、Handler(子線程調用Handler的handle.sendMessage(msg);

Handler handle = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            mTextView.setText(來自網絡的文字);
        }
        
    };

class MyThread extends Thread {

        @Override
        public void run() {
             // 耗時操做           
            loadNetWork();  

            Message msg = new Message();
            handle.sendMessage(msg);
            super.run();
        }
        
        
    }

五、AsyncTask

主線程中:aTask ak = new aTask();
ak.execute();

而後:

private class aTask extends AsyncTask {     //後臺線程執行時     @Override     protected Object doInBackground(Object... params) {         // 耗時操做                     return loadNetWork();     }     //後臺線程執行結束後的操做,其中參數result爲doInBackground返回的結果     @Override     protected void onPostExecute(Object result) {         super.onPostExecute(result);         mTextView.setText(result);     }     }
相關文章
相關標籤/搜索