java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...
之前的例子都是我們?cè)谧泳€程(WorkerThread)當(dāng)中處理并發(fā)送消息,然后在主線程(UI線程)中獲取消息并修改UI,那么可以不可以在由主線程發(fā)送消息,子線程接收呢?我們按照之前的思路寫一下代碼:
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", "收到了消息對(duì)象");
}
};
}
}
}
MainActivity.java
activity_main.xml
上面的問題貌似沒什么錯(cuò)誤,但運(yùn)行時(shí)卻出錯(cuò)
拋出異常:
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)
提示我們沒有調(diào)用Looper.prepare(),無法創(chuàng)建線程,原因是非主線程中默認(rèn)是沒有創(chuàng)建Looper對(duì)象的,需要先調(diào)用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", "收到了消息對(duì)象:" +i);
}
};
Looper.loop();
}
}
}
MainActivity.java
activity_main.xml
運(yùn)行結(jié)果:
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﹕ 收到了消息對(duì)象:100
上面代碼表示,消息是從MainThread發(fā)送的,WorkerThread接收到了消息。
PS:非UI線程默認(rèn)是沒有創(chuàng)建Looper對(duì)象的,所以需要主線程向子線程傳遞消息時(shí),需創(chuàng)建Looper對(duì)象并啟動(dòng)循環(huán),子線程才可以循環(huán)著從MaessageQueue中取出消息。
總結(jié)
以上是生活随笔為你收集整理的java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3获取网页内容_python
- 下一篇: android sina oauth2.