Android線程之並發處理


  上一篇為大家介紹了關於Looper的簡單知識,本篇我們介紹一下多線程的並發處理,我們知道Handler通過sendMessage()發送的消息,首先發送給了Looper,存入Looper的消息棧,之后從新發送給Handler對象,Handler對象通過handMessage()方法處理消息。這里就很容易出現空指針異常,下面我們就一起看一下這段代碼:

public class MainActivity extends Activity {
    
    class Mythread extends Thread{
        private Handler handler;
        private Looper looper;
        @Override
        public void run() {

            Looper.prepare();//創建一個Looper對象
            looper = Looper.myLooper();
            handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    System.out.println("子線程:"+Thread.currentThread());
                }
            };
            Looper.loop();//通過這個方法循環處理方法
            
        }
    };

    private Mythread thread;
    private Handler secondHandler;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        thread = new Mythread();
        thread.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.handler.sendEmptyMessage(1);//在子線程中處理
        
        secondHandler = new Handler(thread.looper){
            @Override
            public void handleMessage(Message msg) {
                System.out.println(msg);
            }
        };
        
        secondHandler.sendEmptyMessage(1);
        
    }

}

  這是就會出現空指針異常,因為當我們的SecondHandler創建時,如果thread.looper對象還未創建,就會出現這個異常。那如何防止這個異常呢?谷歌在設計Android時已經為我們考慮到了這一點,這里我們將使用HandlerThread來處理這種多線程並發的問題。

/**
 * 使用HandlerThread處理多線程並發處理時出現空指針問題
 */
public class SecondActivity extends Activity {
    
    private HandlerThread handlerThread;
    private Handler handler;
    private TextView text;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //創建一個TextView
        text = new TextView(this);
        text.setText("Helloword");
        setContentView(text);
        
        //創建一個Handler的線程對象
        handlerThread = new HandlerThread("handler thread");//為當前的線程起一個名字
        handlerThread.start();//啟動線程
        handler = new Handler(handlerThread.getLooper()){
            @Override
            public void handleMessage(Message msg) {
                System.out.println("current:"+Thread.currentThread());
            }
        };
        handler.sendEmptyMessage(1);
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM