上一篇為大家介紹了關於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); } }