这几天做了个Android手机与电脑连接的网络版五子棋,做的过程中感觉思路还蛮清晰的,结果最后测试的时候出现了一个问题:手机给电脑端发信息电脑都可以接收;而电脑往手机端传递信息时手机则只能接收一次信息,起初以为是通信协议的问题,但又觉得讲不通(如果是协议的问题,那么应该两边都会出现问题),不过还是一行行的System.out.println()测试了一遍,最后发现了一个现象:在手机端自定义的通信线程里一遇到与改动主界面组件有关的方法时线程就自动阻塞(像设置EditText文本信息,在主界面中弹出对话框等),期初一直百思不得其解,最后还是通过查看Logcat警告信息上网查阅,才明白了其中的原因(当时没有报错,就没有想着看WarnInfo),下面我简单的说下自己对Android中线程间信息的传递以及为什么需要信息传递的简单理解:
(一)Android开发遵循单线程模型,所谓单线程模型就是当系统开启一个程序时,系统会主动创建一个主线程(即UI线程),它负责程序界面时间的处理,例如屏幕触摸、屏幕画图、点击等事件。而如果程序需要执行一些耗时的操作时(如连接网络,下载数据、查询数据库等),主线程就会出现或长或短的阻塞现象(比如阻塞UI界面操作)。这样的机制肯定会造成应用软件的低效率。为解决这个问题,Android1开发包就引入了后台线程创建的API,主要有以下几种方法(这些都是在网上搜的,自己较熟悉的只有Handler类的使用):
- Activity.runOnUiThread( Runnable )
- View.post( Runnable )
- View.postDelayed( Runnable, long )
- Hanlder
接下来我就说下我对第四种方法使用的理解:
这种方法主要涉及到四个类:Message\Message Queue\Looper\Handler
首先Message Queue是信息队列,在主线程创建的时候会自动生成此类和将此队列中信息(Message类对象)传入Handler类的Looper对象。其他子线程需要专门创建其对应的Looper对象,这样说大家可能就明白了四者之间的关系了。
其次就是实现线程间信息传递的具体流程了:
其实很简单关键是创建Handler类对象(运用它的构造方法new Handler(Looper looper)),重写其中的HandlerMessage(Message msg)方法,这步中谨记构造方法中传入的Looper对象就是你要处理信息的线程对应的Looper,其中Looper有两个创建对象的方法;Looper.getMainLooper()获得主线程的Looper对象;Looper.myLooper()获得所在线程的Looper对象。之后即就是在你要传递信息的线程中创建Message对象,调用Handler的sendMessage(Message msg)方法,之中将你要传递的消息设置为Message的obj属性值。
(附:如果你在子线程中调用了更改UI界面的方法,那么会抛出calledWrongThreadException异常)
(二)现在想想为什么要运用单线程模型呢,原因是Android中的UI线程处理操作是不安全的,所以说凡是关于UI界面的操作必须是有主线程来执行,其他线程执行就会出现线程阻塞。
最后貌似还有不用这么麻烦的方法,Android中貌似有个类:AsyncTask,不过我这会对这个类还不是很熟悉,所以就不说了,大家有兴趣可以研究下,好了,终于又写了一篇博客了,心里比较安慰了,希望以后再接再厉,长久保持!!!
分享到:
相关推荐
浅谈android线程模型
android 线程间通讯
Android----线程实现图片移动 , 运用线程实现图片的水平循环往返移动!
这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。
Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制
Android开发中的多线程编程技术资源包 TAG:Android 多线程 应用开发 Alfred整理发布,版权所有!
在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换...
首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...
NULL 博文链接:https://shufeipenglove-163-com.iteye.com/blog/1181222
线程间通信方式3:消息传递方式的演示。采用计算演示线程的执行,并采用用户界面线程来实时显示执行的进度,线程间的通信方式采用了3种方式相结合,对多线程间的通信有比较好的学习和研究价值。
NoHttp核心架构之多线程通信、线程安全、线程同步;synchronized锁,Lock锁;具体讲解请移步博客:http://blog.csdn.net/yanzhenjie1003/article/details/50992468
Android线程结束——合理的结束你想结束的线程
android多线程机制教程 android多线程机制 android多线程机制 android多线程机制
android 线程间通信的介绍,非常实用。
本实例是Android开发中关于单线程的断点续传的简单实践
android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序
android多线程模型和service分析
android 多线程 数据传递 handle 源代码 可以通过handle更新ui,提高客户体验
因Android Studio下整体项目太大,此文件仅包含核心代码,核心都在MainActivity中,包括: 1. 主线程直接加载,不可用; 2. 采用handler+Thread模式实现多线程异步加载; 3. 引入线程池来管理多线程 4. 引入线程池,...
android多线程管理,实现多线程