这几天做了个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中的线程模型 1. Handler-Looper-Messenger:通过Handler、Looper和Message对象在主线程和工作线程之间传递消息,进行同步或异步通信。 2. AsyncTask:轻量级的多线程解决方案,适合短时间的后台任务,...
这是因为在Android中,默认情况下UI操作是非线程安全的,这意味着它们只能在一个特定的线程(即UI线程)中被安全地执行。 #### 三、单线程模型的重要性 理解单线程模型对开发者来说至关重要。如果在设计程序时不...
首先,Android系统是基于单线程模型的,主线程(也称为UI线程)负责处理用户交互和更新UI。由于Android对主线程有严格的限制,不允许在主线程中执行耗时操作,如网络请求或数据库操作,否则会导致应用无响应(ANR)...
### Android多线程详解 #### 一、进程与线程概览 在深入探讨Android多线程之前,我们首先理解进程和线程的基本...然而,多线程编程也伴随着复杂性,如线程安全、死锁等问题,需要开发者在实践中不断学习和积累经验。
Android系统采用的是单线程模型,即主线程(也称为UI线程)主要负责处理用户界面的交互和绘图,包括按键事件、触摸事件以及屏幕绘制。由于主线程的重要性,所有与UI相关的操作必须在此线程中执行,以确保界面的流畅...
Android采用了单线程模型,即所有的UI操作都必须在主线程中执行。这是因为Android UI组件并未设计为线程安全的。这种设计确保了UI的一致性和稳定性。 **单线程模型的特点:** - **主线程:** 主线程负责处理UI相关...
Android系统采用单线程模型,即UI组件的所有操作都在一个主线程中执行,以确保UI的一致性和线程安全性。如果在其他线程中直接修改UI,会导致应用崩溃或出现未定义的行为。 2. **线程与UI更新**: - **方法一**:...
本讲将深入探讨Android线程的使用,特别是如何利用Handler来实现在主线程中更新UI。Handler是Android中的一个消息处理机制,它与Looper和Message紧密配合,用于在不同的线程间传递消息并执行相应的回调方法。 1. **...
在实际开发中,我们还需要关注线程安全问题,尤其是在多个线程共享数据时,必须使用锁(synchronized关键字)或者其他同步机制来确保数据的一致性。此外,Android还提供了Intent、BroadcastReceiver等机制来实现在...
处理UI更新时,必须遵循Android的单线程模型,即所有的UI操作必须在主线程中进行。这意味着子线程不能直接修改UI组件,否则会抛出异常。为了在子线程中进行UI更新,可以使用Handler发送一个Message,然后在主线程的...
Android中的单线程模型限制了UI线程的操作,不允许在子线程中直接修改UI元素。为了解决这个问题,Android引入了Handler、Message和Message Queue,以及Looper组件来实现线程间通信。Handler是用于发送和处理消息的类...
- Android提供了线程安全的集合类,如`SynchronizedList`、`SynchronizedSet`和`ConcurrentHashMap`,保证在多线程环境下数据的一致性。 10. **线程优先级** - Android线程也支持设置优先级,但通常不建议依赖...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
Android线程消息机制是Android应用开发中的核心概念之一,它涉及到多线程、并发处理以及UI更新的安全性。本文将深入解析这一机制,帮助你轻松掌握这个关键知识点。 首先,我们要明白Android系统对应用程序的执行...
一、Android中的线程模型 在Android系统中,主线程(UI线程)主要负责处理用户界面的更新和事件响应,因此,如果一个耗时的操作(如网络请求或数据库操作)在主线程上执行,将会导致应用无响应(ANR,Application ...
在Android中,由于UI单线程模型的限制,只有主线程可以更新UI元素,所以当子线程执行完任务后,如果需要更新UI,它不能直接操作UI元素。它必须通过特定的通信机制来与主线程通信,告知主线程进行相应的UI更新。 ###...
主线程遵循单线程模型,确保UI组件的操作按顺序执行,避免了竞态条件和不必要的同步开销。 2. Looper和MessageQueue:主线程内有一个Looper对象,它维护了一个MessageQueue(消息队列)。当一个任务需要在主线程中...
2. **线程管理**:由于服务器需要同时处理多个客户端的请求,源码中可能包含了线程池或HandlerThread的使用,以便为每个新连接创建一个新的工作线程,避免单线程模型带来的性能瓶颈。 3. **数据交换格式**:服务器...
由于Android采用了UI单线程模型,所有UI组件的操作必须在主线程中执行。如果尝试在非UI线程中直接修改UI组件,将会触发`CalledFromWrongThreadException`异常。 为了提高用户体验并避免UI卡顿,开发者通常会在后台...