日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...

發(fā)布時(shí)間:2025/3/15 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前的例子都是我們?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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。