课程目标:学习Android中异步操作的三大方式

重点难点:Handler与线程的关系   Handler消息队列的实现

考核目标:

使用Handler是异步的,它会建立新线程么? no

Handler是在主线程内么?

Handler的post 和 sentMessage方法,使用的是一个队列还是两个?

子线程中建立一个handler,然后sendMessage会怎样?

子线程建立handler , 构造的时候传入主线程的,Looper?  Yes   

 

 

 

一、回顾Java多线程基础

Runnable

Thread

ThreadPool

ScheduleExecutor

线程同步:Synchronized\Lock\Semaphore。

二、在Android中使用多线程

1>为何使用多线程

对于耗时操作,我们应该放到非主线程中运行,从而避免阻塞主线程。

为了保证良好的用户体验,建议对超过50ms的操作,都使用线程处理。

aIO操作(文件操作、网络操作、数据库操作...).

b复杂运算.

c定时操作.

2>如何使用多线程或异步操作

3>多线程和界面交互

  在Android源代码中,我们可以看到Android UI的代码是没有做同步处理的,也就是说,他们不是线程安全的。

  那么,Android是如何保证UI的正常运行的?

  当我们在非主线程操作UI时,Android会抛出异常,所以我们应当确保UI操作应该在主线程运行。

a>Activity.runOnUiThread(Runnable)

b>View.post(Runnable) ; View.postDelay(Runnable , long)

c>Handler

d>AsyncTask

4>Android UI 主线程简单原则

不要Block UI Thread

不要在UI线程外直接操作UI

 

三、使用Handler-异步时或不可缺的组件

问题:使用多线程时遇到的问题。

我想和UI进行交互,但每次都创建Runnable看起来很别扭,而且代码很难管理。

我的程序中需要不断的加载更新的数据,我该怎么确保数据的正确性?

用户快速的点击按钮,我的程序无法有足够快的响应,该怎么办?

问题:什么是Handler及其作用。

Hanlder作用:

1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器

2)线程间通信。在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。

3) 确保操作始终在某个特定的线程中运行。例如当我们从数据库加载数据时,除了程序启动时需要加载外,每当我们收到数据改变的通知时也需要重新加载。为了确保数据的有效性(始终使用最后一次查询时得到的数据),并减少不必要的查询操作,我们应当确保他们在同一个线程中运行。

 

 角色描述

1.Looper:(相当于隧道) 一个线程可以产生一个Looper 对象,由它来管理此线程里的Message Queue( 车队,消息隧道)

2.Handler: 你可以构造Handler 对象来与Looper 沟通,以便push 新消息到Message Queue 里;或者接收Looper( 从Message Queue 取出) 所送来的消息。

3. Message Queue( 消息队列): 用来存放线程放入的消息。

4 .线程:UI thread 通常就是main thread ,而Android 启动程序时会替它建立一个Message Queue

 

每一个线程里可含有一个Looper 对象以及一个MessageQueue 数据结构。在你的应用程序里,可以定义Handler 的子类别来接收Looper 所送出的消息。

线程必须调用Looper.loop()让其开始消息处理过程,且此时该线程无法执行其他代码。

【误区: Handler 一定是在主线程么?】

 

 问题:让我们通过代码来了解问题。

1>Handler实例与消息处理是关联的,发送和接收要匹配

2>只能依附在HandlerThread

3>可以通过设置Looper来选择其依附的线程

4>所有操作都是在用一个线程中

5>removeMessage只能移除队列中的Message

 

四、使用AsyncTask快速实现异步任务

1>什么是AsyncTask

Android为了降低异步操作开发难度,结合Handler和线程池,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。他具有可以在后台执行耗时操作,同时可以讲执行进度与UI进行同步的优点。

2>如何使用AsyncTask

AsyncTask定义了三种泛型类型 Params,Progress和Result

Params 启动任务执行的输入参数,比如HTTP请求的URL

Progress 后台任务执行的百分比。

Result 后台执行任务最终返回的结果,比如String

AsyncTask方法

doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。

onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI此方法在主线程执行,任务执行的结果作为此方法的参数返回

可选方法:

onProgressUpdate(Progress…)   可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。

onPreExecute()        这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。

onCancelled()             用户调用取消时,要做的操作

AsyncTask三个状态:pending , running , finished

 【规则】

AsyncTask必须在主线程创建;

execute() 只能调用一次;

execute() 必须在主线程执行;

不要自己调用onPreExecute(), onPostExecute(), doInBackground(), onProgressUpdate();

3>分析AsyncTask的实现原理

4>分析AsyncTask和Handler谁更消耗资源

如何分析一个进程占用内存的大小。

5>探讨什么使用使用AsyncTask, 什么时候使用Handler

任务可以被中止,并需要不断和使用时AsyncTask;

任务需要被多次重复执行,且和UI交互少时用Handler;

、检测程序中是否有需要使用多线程的地方

1>StrictMode.ThreadPolicy

detectDiskReads()

detectDiskWrites()

detectNetwork()

2>检测后的处理方法

penaltyLog()

penaltyDeath()

penaltyDialog()

penaltyDropBox()

penaltyFlashScreen()

13、Android的多线程与异步任务的更多相关文章

  1. Android 多线程----AsyncTask异步任务详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. Android Learning:多线程与异步消息处理机制

    在最近学习Android项目源码的过程中,遇到了很多多线程以及异步消息处理的机制.由于之前对这块的知识只是浅尝辄止,并没有系统的理解.但是工程中反复出现让我意识到这个知识的重要性.所以我整理出这篇博客 ...

  3. Android多线程及异步处理问题

    1.问题提出 1)为何需要多线程? 2)多线程如何实现? 3)多线程机制的核心是啥? 4)到底有多少种实现方式? 2.问题分析 1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到 ...

  4. 从Nginx的Web请求处理机制中剖析多进程、多线程、异步IO

    Nginx服务器web请求处理机制 从设计架构来说,Nginx服务器是与众不同的.不同之处一方面体现在它的模块化设计,另一方面,也是最重要的一方面,体现在它对客户端请求的处理机制上. Web服务器和客 ...

  5. 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    [源码下载] 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换 作者:webabcd 介绍 ...

  6. 重新想象 Windows 8 Store Apps (45) - 多线程之异步编程: IAsyncAction, IAsyncOperation, IAsyncActionWithProgress, IAsyncOperationWithProgress

    [源码下载] 重新想象 Windows 8 Store Apps (45) - 多线程之异步编程: IAsyncAction, IAsyncOperation, IAsyncActionWithPro ...

  7. c# 中的多线程和异步

    前言: 1.异步和多线程有区别吗? 答案:多线程可以说是实现异步的一种方法方法,两者的共同目的:使主线程保持对用户操作的实时响应,如点击.拖拽.输入字符等.使主程序看起来实时都保持着等待用户响应的状态 ...

  8. 第一章 管理程序流(In .net4.5) 之 实现多线程和异步处理

    1. 概述 本章主要讲解.net4.5如何实现多线程和异步处理的相关内容. 2. 主要内容 2.1 理解线程 ① 使用Thread类   public static class Program   { ...

  9. Android引入高速缓存的异步加载全分辨率

    Android引进高速缓存的异步加载全分辨率 为什么要缓存 通过图像缩放,我们这样做是对的异步加载优化的大图,但现在的App这不仅是一款高清大图.图.动不动就是图文混排.以图代文,假设这些图片都载入到 ...

随机推荐

  1. 【BZOJ 1934】 [Shoi2007]Vote 善意的投票

    Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可 ...

  2. shell 后台执行命令

    shell 后台执行命令方法: 1. nohup cmd &          后台会生成 nohup.out 文件 2.cmd >/路径/xx.log &   后台生成 xx. ...

  3. maven+mybatis-generator插件反向生成源代码

    通过maven+mybatis-generator插件反向生成源代码,如有一个table表为resource,那么将自动生成这样三个文件:Resource.java类.ResourceMapper.j ...

  4. qwt 6.1.0集成进Qt creator 2.8.1步骤

    环境准备与文件编译 ·关于Qt 发现一个Qt正确安装的教程,非常棒!http://www.wikihow.com/Install-Qt-SDK-on-Ubuntu-Linux Qt版本是4.8.5,在 ...

  5. 【数位DP】Hdu 2089:不要62

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. [转载]MongoDB优化的几点原则

    .查询优化 确认你的查询是否充分利用到了索引,用explain命令查看一下查询执行的情况,添加必要的索引,避免扫表操作. .搞清你的热数据大小 可能你的数据集非常大,但是这并不那么重要,重要的是你的热 ...

  7. Struts2自定义拦截器实例—登陆权限验证

    版本:struts2.1.6 此实例实现功能:用户需要指定用户名登陆,登陆成功进入相应页面执行操作,否则返回到登陆页面进行登陆,当直接访问操作页面(登陆后才能访问的页面)时则不允许,须返回登陆页面. ...

  8. HDU 1422 重温世界杯(DP)

    点我看题目 题意 : 中文题不详述. 思路 : 根据题目描述及样例可以看出来,如果你第一个城市选的是生活费减花费大于等于0的时候才可以,最好是多余的,这样接下来的就算是花超了(一定限度内的花超),也可 ...

  9. 将ANGULAR与后端请求结合

    简单的结合,却是很多应用的基础.RESTFUL就此而生.瘦服务,富客户. <!DOCTYPE html> <html lang="en" ng-app=" ...

  10. mvc学习

    视频: http://edu.51cto.com/index.php?do=lession&id=14581 博客: http://www.cnblogs.com/chsword/archiv ...