举报企业网站用个人信息备案公司网站功能
web/
2025/10/5 0:47:25/
文章来源:
举报企业网站用个人信息备案,公司网站功能,字体设计欣赏网站,网页设计图片怎么占满相应位置转http://www.iteye.com/problems/69457Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService)#xff0c;在padService中会启动一个线程(暂定为Thread-3)发起Socket连接。我们项目中使用mina作为socket通信框架#xff0c;用过mina的同志们应该熟悉#xff0c…转http://www.iteye.com/problems/69457Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService)在padService中会启动一个线程(暂定为Thread-3)发起Socket连接。我们项目中使用mina作为socket通信框架用过mina的同志们应该熟悉Thread-3只是负责监听具体的消息处理是另外的线程。在我们的IoHandler中处理消息现在的问题是我需要在IoHander的sessionOpened方法中给Activity一个消息去更新UI界面这个就涉及到不同线程间的通信了。网上搜索后在android中线程间通信使用HandlerLooperMessage这几个对象(不熟悉这些概念的同志们请自己查下)。这是网上的一个使用例子Java代码publicclassActivity2 extendsActivity implementsOnClickListener{Button button null;TextView text null;MyHandler mHandler null;Thread thread ;OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity1);button (Button)findViewById(R.id.btn);button.setOnClickListener(this);text (TextView)findViewById(R.id.content);}publicvoidonClick(View v) {switch(v.getId()) {caseR.id.btn:thread newMyThread();thread.start();break;}}privateclassMyHandler extendsHandler{publicMyHandler(Looper looper){super(looper);}OverridepublicvoidhandleMessage(Message msg) {//处理消息text.setText(msg.obj.toString());}}privateclassMyThread extendsThread{Overridepublicvoidrun() {Looper curLooper Looper.myLooper();Looper mainLooper Looper.getMainLooper();String msg ;if(curLoopernull){mHandler newMyHandler(mainLooper);msg curLooper is null;}else{mHandler newMyHandler(curLooper);msg This is curLooper;}mHandler.removeMessages(0);Message m mHandler.obtainMessage(1, 1, 1, msg);mHandler.sendMessage(m);}}}这个没有问题基本上三个对象的使用也很清楚myHandler虽然是由子线程new出来的但主线程持有引用在我们的项目中不能用因为我们几个线程属于不同的类我尝试用下面的方法解决在IoHandler中new一个android的handler参数为主线程的LooperJava代码newHandler(Looper.getMainLooper()).sendMessage(msg);IoHandler所在的线程给主线程发送消息(looper是主线程的消息也就放在主线程的消息队列里了)但是在主线程的handleMessage方法中得不到消息尝试失败。那么怎么办呢让IoHandler持有主线程的handler引用具体做法有两种方式1. 参数传递把主线程的handler通过参数传递的形式传到IoHandler中。2. 静态变量把主线程的handler申明为公共静态变量Java代码publicstaticHandler mainHandler;这样在Iohandler中使用Java代码welcomeActivity.mainHandler.sendMessage(msg);这两种方式在主线程的 handleMessage的方法中都可以得到IoHandler发送的消息。本人使用的是静态变量解决的因为有好几个来实现通信参数传递太麻烦。那为什么我的第一种尝试是失败的呢我是把消息放到主线程的消息队列了啊这就要看android的一些实现机制了。通过网络和android的api本人的理解如下Looper是MessageQueue和Handler沟通的桥梁Handler通过Looper把消息放入消息队列(MessageQueue)你想把消息发给谁就把谁的looper作为参数传给HandlerJava代码newHandler(Looper looper);Looper把消息放入消息队列并广播消息这个不太好理解我举例如下主线程的Handler我们这样定义Handler mainHandler new Handler(); 如果Handler没有参数默认为当前线程的Looper子线程的Handler我们这样定义 Handler subHandler newHandler(Looper.getMainLooper()); 参数为主线程的Looper这样两个线程都会把消息放入主线程的消息队列里了。现在mainHandler.sendMessage(), 消息进入主线程的消息队列Looper广播消息其实就是调用mainHandler的dispatchMessage方法所有持有mianHandler引用的类都可以收到消息注意啊现在subHandler并不能接受到消息因为Looper并没有调用subHandler的dispatchMessage方法所以应该这样理解广播A发送消息那么A的Looper就调用A的dispatchMessage方法别的BC D虽然也是A的Looper但没有A的引用所以BCD是接受不到消息的如果B, C,D持有A的引用但B,C,D不用A的Looper那么也是接受不到消息的。这点在开发时要特别注意。以上是我在使用Looper Handler Message中的一些问题可能有理解错的地方请大大们指出来。我的疑惑是难道子线程必须持有主线程的引用才可以给主线程发送消息吗要知道我们的子线程并不一定和主线程一个类可能在别的类中这个引用传递实在太麻烦了期望有更好的解决方式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87067.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!