Android線程之並發處理

來源:互聯網
上載者:User

標籤:

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

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);            }}

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

/** * 使用HandlerThread處理多線程並發處理時出現null 指標問題 */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);    }    }

 

Android線程之並發處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.