首页 > 学院 > 开发设计 > 正文

BBK远程实习总结 17.02.6

2019-11-09 17:25:54
字体:
来源:转载
供稿:网友

本次总结的内容如下 1.Handler,Thread,HandlerThread的区别 2.Handler体系的原理 3.Android多线程与多进程

Handler体系以及原理

体系成员

Handler

与Looper进行沟通,获得其中的消息,并完成消息的具体处理

Looper

Looper实现对消息队列的管理,一个线程只可有一个Looper

MessageQueue

用于管理Message的消息队列

Message

用于存储消息的具体信息

基本流程

文字描述

为了方便理解,我们假设是在主线程中使用的Handler (1)首先我们在主线程中 newHandler 绑定到了主线程中的Looper (2)post出去的消息也就发到了UI线程中Looper的消息队列中 (3)Looper循环处理Message中的消息其实是回调了 Handler中的处理方法 (4)同时Looper是在它绑定的的线程里执行处理方法的,其实就相当于在UI线程中执行了处理代码,也就可以更新UI了。

图片

基本流程

Thread,Handler,HandlerThread

Thread

java中常用的线程类,在Android中我们一般会创建子线程以完成耗时任务,以避免主线程阻塞(ANR)。

使用

只需要继承Thread类,然后重写run方法即可。

Handler

Handler体系中的核心类,用于实现处理Message的逻辑

HandlerThread

本质上是一个包含了Looper的的Thread

作用

当位于非UI线程我们需要使用Handler体系时,需要自己手动创建一个Looper,并且进行PRepare和`start,如果我们使用HandlerThread,在这其中已经帮我们完成以上操作,应该说方便了一点。

特点

HandlerThread将loop转到子线程中处理,说白了就是将分担MainLooper的工作量,降低了主线程的压力,使主界面更流畅。

开启一个线程起到多个线程的作用。处理任务是串行执行,按消息发送顺序进行处理。HandlerThread本质是一个线程,在线程内部,代码是串行处理的。

但是由于每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。

HandlerThread拥有自己的消息队列,它不会干扰或阻塞UI线程。

对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。

Android中的多进程与多线程

概述

当某个应用组件启动且该应用没有运行其他任何组件时,Android 系统会使用单个执行线程为应用启动新的 linux 进程。默认情况下,同一应用的所有组件在相同的进程和线程(称为“主”线程)中运行。 如果某个应用组件启动且该应用已存在进程(因为存在该应用的其他组件),则该组件会在此进程内启动并使用相同的执行线程。 但是,您可以安排应用中的其他组件在单独的进程中运行,并为任何进程创建额外的线程。

多进程

UID和PID

每一个应用有一个UID,相当于Linux中的一个用户。每一个PID可以对应多个PID(进程号)。正常情况下,每一个应用都运行在自己的用户空间中,不能访问其他应用的数据。

一个应用含多个进程

在一个APP中开启多个进程,可以通过在Androidmanifest中相应的组件中添加Android:preocess属性,如果以:开头,那么这个进程就是应用的私有进程,如果不,那么其他应用可以设置sharedUserID跑在这个进程中。

影响

全局变量和单例模式失效创建多个application线程同步机制完全失效

多个应用跑在同一进程

在自己开发的系统中,可以让系统组件跑在系统进程中以获得相应权限

实现

满足以下两个条件的应用可以跑在同一进程,这样就可以互相访问数据了。 1. Androidmanifest文件根标签下的sharedUserId相同 2. 签名相同

多线程

UI线程

应用启动时,系统会为应用创建一个名为“主线程”的执行线程。 此线程非常重要,因为它负责将事件分派给相应的用户界面小部件,其中包括绘图事件。 此外,它也是应用与 Android UI 工具包组件(来自 android.widget 和 android.view 软件包的组件)进行交互的线程。因此,主线程有时也称为 UI 线程。 系统不会为每个组件实例创建单独的线程。运行于同一进程的所有组件均在 UI 线程中实例化,并且对每个组件的系统调用均由该线程进行分派。 因此,响应系统回调的方法(例如,报告用户操作的 onKeyDown() 或生命周期回调方法)始终在进程的 UI 线程中运行。

不要阻塞UI线程

因为主线程负责UI的更新与管理,如果耗时操作不在子线程中处理,会让UI线程阻塞并且出现ANR。

进程间通信

Android系统中应用程序之间不能共享内存,在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。 PS:具体方法因篇幅原因不在这里详述

有部分内容转载自其他博主 http://www.cnblogs.com/hanyonglu/archive/2012/04/12/2443262.html http://blog.csdn.net/androidflying007/article/details/53509710

`


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表