`
kuailehuahua
  • 浏览: 6951 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
社区版块
存档分类

Android中线程间的信息传递(单线程模型<---线程安全性)

 
阅读更多

       这几天做了个Android手机与电脑连接的网络版五子棋,做的过程中感觉思路还蛮清晰的,结果最后测试的时候出现了一个问题:手机给电脑端发信息电脑都可以接收;而电脑往手机端传递信息时手机则只能接收一次信息,起初以为是通信协议的问题,但又觉得讲不通(如果是协议的问题,那么应该两边都会出现问题),不过还是一行行的System.out.println()测试了一遍,最后发现了一个现象:在手机端自定义的通信线程里一遇到与改动主界面组件有关的方法时线程就自动阻塞(像设置EditText文本信息,在主界面中弹出对话框等),期初一直百思不得其解,最后还是通过查看Logcat警告信息上网查阅,才明白了其中的原因(当时没有报错,就没有想着看WarnInfo),下面我简单的说下自己对Android中线程间信息的传递以及为什么需要信息传递的简单理解:

         (一)Android开发遵循单线程模型,所谓单线程模型就是当系统开启一个程序时,系统会主动创建一个主线程(即UI线程),它负责程序界面时间的处理,例如屏幕触摸、屏幕画图、点击等事件。而如果程序需要执行一些耗时的操作时(如连接网络,下载数据、查询数据库等),主线程就会出现或长或短的阻塞现象(比如阻塞UI界面操作)。这样的机制肯定会造成应用软件的低效率。为解决这个问题,Android1开发包就引入了后台线程创建的API,主要有以下几种方法(这些都是在网上搜的,自己较熟悉的只有Handler类的使用):

  1. Activity.runOnUiThread( Runnable )  
  2. View.post( Runnable )  
  3. View.postDelayed( Runnable, long )  
  4. 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中的线程模型 1. Handler-Looper-Messenger:通过Handler、Looper和Message对象在主线程和工作线程之间传递消息,进行同步或异步通信。 2. AsyncTask:轻量级的多线程解决方案,适合短时间的后台任务,...

    android 线程间通信显示同步时间

    首先,Android系统是基于单线程模型的,主线程(也称为UI线程)负责处理用户交互和更新UI。由于Android对主线程有严格的限制,不允许在主线程中执行耗时操作,如网络请求或数据库操作,否则会导致应用无响应(ANR)...

    Android多线程处理[参考].pdf

    Android系统采用的是单线程模型,即主线程(也称为UI线程)主要负责处理用户界面的交互和绘图,包括按键事件、触摸事件以及屏幕绘制。由于主线程的重要性,所有与UI相关的操作必须在此线程中执行,以确保界面的流畅...

    Android的线程使用来更新UI

    Android系统采用单线程模型,即UI组件的所有操作都在一个主线程中执行,以确保UI的一致性和线程安全性。如果在其他线程中直接修改UI,会导致应用崩溃或出现未定义的行为。 2. **线程与UI更新**: - **方法一**:...

    [毕设季 android开发]第六讲:Android线程及UI更新

    本讲将深入探讨Android线程的使用,特别是如何利用Handler来实现在主线程中更新UI。Handler是Android中的一个消息处理机制,它与Looper和Message紧密配合,用于在不同的线程间传递消息并执行相应的回调方法。 1. **...

    android多线程技术的应用

    在实际开发中,我们还需要关注线程安全问题,尤其是在多个线程共享数据时,必须使用锁(synchronized关键字)或者其他同步机制来确保数据的一致性。此外,Android还提供了Intent、BroadcastReceiver等机制来实现在...

    Android多线程处理[归类].pdf

    Android中的单线程模型限制了UI线程的操作,不允许在子线程中直接修改UI元素。为了解决这个问题,Android引入了Handler、Message和Message Queue,以及Looper组件来实现线程间通信。Handler是用于发送和处理消息的类...

    安卓Android源码——讲多线程的操作方式.zip

    - Android提供了线程安全的集合类,如`SynchronizedList`、`SynchronizedSet`和`ConcurrentHashMap`,保证在多线程环境下数据的一致性。 10. **线程优先级** - Android线程也支持设置优先级,但通常不建议依赖...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    深理解android 线程消息机制教程

    Android线程消息机制是Android应用开发中的核心概念之一,它涉及到多线程、并发处理以及UI更新的安全性。本文将深入解析这一机制,帮助你轻松掌握这个关键知识点。 首先,我们要明白Android系统对应用程序的执行...

    安卓UI线程机制 ,在子线程中访问UI

    主线程遵循单线程模型,确保UI组件的操作按顺序执行,避免了竞态条件和不必要的同步开销。 2. Looper和MessageQueue:主线程内有一个Looper对象,它维护了一个MessageQueue(消息队列)。当一个任务需要在主线程中...

    Android程序源码--服务器

    2. **线程管理**:由于服务器需要同时处理多个客户端的请求,源码中可能包含了线程池或HandlerThread的使用,以便为每个新连接创建一个新的工作线程,避免单线程模型带来的性能瓶颈。 3. **数据交换格式**:服务器...

    Android中文翻译组——Android中文合集(6)

    Intent则是Android系统中用于组件间通信的机制,它可以启动或启动新的Activity,或者在已有Activity之间传递数据。 4. **Fragment**:随着屏幕尺寸多样化的趋势,Fragment成为了支持多屏显示和动态布局的重要组件。...

    Android_Handle_Thread

    遵循单线程模型的原则,所有的 UI 操作必须在 UI 线程中执行,以确保线程安全。然而,由于耗时操作会阻塞 UI,因此通常需要在子线程中执行这类任务。 为了在子线程和 UI 线程之间进行通信,Android 提供了 Message ...

    Android Handle Thread.docx

    遵循单线程模型原则,所有对UI的操作都必须在主线程中执行,因为它们不是线程安全的。为了防止阻塞主线程,长时间运行的任务应被移到后台线程。这就引出了Message Queue的概念。 Message Queue是一种通信机制,它...

    android_multithread.zip_android

    在Android中进行多线程编程时,需要注意内存泄漏、线程安全、UI更新必须在主线程等问题。同时,要理解Android系统的进程和线程模型,以便更好地优化应用性能。 综上所述,"android_multithread.zip"中的资料将涵盖...

    UI线程

    由于Android系统的单线程模型,所有对UI的操作都必须在UI线程中执行,以确保界面操作的同步性和一致性。 当我们谈论UI线程时,有几个关键知识点是必须要理解的: 1. **线程安全**:由于所有与UI相关的操作都在同一...

    Android常见原理性面试专题.pdf

    4. **单线程模型中Message、Handler、Message Queue、Looper的关系** - Message:存储要传递的数据。 - Handler:发送消息到Message Queue,同时处理Message。 - Message Queue:消息队列,按顺序存放Message。 ...

    android-code-analysis.rar_android

    3. **Intent机制**:Intent是Android中组件间通信的主要方式,用于启动Activity或Service,传递数据。理解Intent的工作原理以及如何构造不同类型的Intent(显式和隐式)是分析代码的关键。 4. **线程与异步处理**:...

    Android面试题整理

    - **Intent机制**:意图Intent是Android系统中对象间通信的主要方式,用于启动Activity或Service,理解其类型(显式和隐式)和如何传递数据。 - **Service**:后台运行的服务,无用户界面,可以长时间执行任务,...

Global site tag (gtag.js) - Google Analytics