java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...
之前的例子都是我們在子線程(WorkerThread)當中處理并發送消息,然后在主線程(UI線程)中獲取消息并修改UI,那么可以不可以在由主線程發送消息,子線程接收呢?我們按照之前的思路寫一下代碼:
packagecn.lixyz.handlertest;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;public class MainActivity extendsActivity {privateButton button;privateHandler handler;private int i = 0;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button) findViewById(R.id.button);
button.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
Log.d("TTTT", "onClick:" +Thread.currentThread().getName());
Message msg=handler.obtainMessage();
handler.sendMessage(msg);
}
});
WorkerThread wt= newWorkerThread();
wt.start();
}class WorkerThread extendsThread {
@Overridepublic voidrun() {super.run();
handler= newHandler() {
@Overridepublic voidhandleMessage(Message msg) {super.handleMessage(msg);
Log.d("TTTT", "收到了消息對象");
}
};
}
}
}
MainActivity.java
activity_main.xml
上面的問題貌似沒什么錯誤,但運行時卻出錯
拋出異常:
09-17 04:01:31.655 15854-15869/? E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-120
Process: cn.lixyz.handlertest, PID: 15854
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.(Handler.java:200)
at android.os.Handler.(Handler.java:114)
at cn.lixyz.handlertest.MainActivity$WorkerThread$1.(MainActivity.java:48)
at cn.lixyz.handlertest.MainActivity$WorkerThread.run(MainActivity.java:48)
提示我們沒有調用Looper.prepare(),無法創建線程,原因是非主線程中默認是沒有創建Looper對象的,需要先調用Looper.prepare()啟用Looper。修改一下上面的代碼。
packagecn.lixyz.handlertest;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Looper;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;public class MainActivity extendsActivity {privateButton button;privateHandler handler;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button) findViewById(R.id.button);
button.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
Message msg=handler.obtainMessage();
msg.what= 100;
handler.sendMessage(msg);
Log.d("TTTT", "sendMessage:" +Thread.currentThread().getName());
}
});
WorkerThread wt= newWorkerThread();
wt.start();
}class WorkerThread extendsThread {
@Overridepublic voidrun() {super.run();
Looper.prepare();
handler= newHandler() {
@Overridepublic voidhandleMessage(Message msg) {super.handleMessage(msg);
Log.d("TTTT", "handleMessage:" +Thread.currentThread().getName());int i =msg.what;
Log.d("TTTT", "收到了消息對象:" +i);
}
};
Looper.loop();
}
}
}
MainActivity.java
activity_main.xml
運行結果:
09-17 04:29:48.669 28397-28397/cn.lixyz.handlertest D/TTTT﹕ sendMessage:main09-17 04:29:48.669 28397-28410/cn.lixyz.handlertest D/TTTT﹕ handleMessage:Thread-141
09-17 04:29:48.669 28397-28410/cn.lixyz.handlertest D/TTTT﹕ 收到了消息對象:100
上面代碼表示,消息是從MainThread發送的,WorkerThread接收到了消息。
PS:非UI線程默認是沒有創建Looper對象的,所以需要主線程向子線程傳遞消息時,需創建Looper對象并啟動循環,子線程才可以循環著從MaessageQueue中取出消息。
總結
以上是生活随笔為你收集整理的java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3获取网页内容_python
- 下一篇: iic总线从机仲裁_I2C总线的仲裁问题