android多任务实现的基本原理

基本概念

操作一些耗时操作时,如I/O读写大文件,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应提示窗口,这个时候我们可以考虑使用THread线程来解决。

在android系统中,如果有一个应用程序组件是第一次启动,这个时间,应用程序没有其他组件在运行,则android系统会为程序创建一个linux进程(Linux Process),这个linux进程包括一个线程(Thread)成为主线程(Main Thread)活UI线程(UI Thread)
当一个组件在启动的时候,如果该process已经存在了,那么组件就直接通过这个process被启动起来,并且运行在这个process的UI Thread中

进程

默认情况下,同一个应用程序内的所有组件都是运行在同一个进程中的,大部分应用程序都是按照这种方式运行的。
在具体应用中,很多时候需要通过在manifest文件中进行设置,通过修改四大组件在Manifest.xml中的代码块()中的android:process属性指定组件运行的进程,使其运行在不同的process中。
元素也支持android:process属性,用于指定鄋组件的默认进程。

进程的重要性层次结构
进程有5种层次,按其重要程度递减分为

前台进程

  1. 拥有一个正在与用户交互的Activity
  2. 拥有一个Service,这个Service绑定了某一个正在与用户交互的Activity
  3. 拥有一个前台Service
  4. 拥有一个Service且他正在执行生命周期毁掉方法
  5. 拥有一个BroadcastsReceiver且这个BroadcatsReceiver正在执行onReceive方法

可见进程

  1. 没有任何前台组件,但会影响用户在屏幕上所见内容的进程
  2. 拥有一个可见但不可与用户交互的Activity
  3. 拥有一个Service, 这个Service绑定了一个可见但不可与用户交互的Activity

3.服务进程

由startService()方法启动的Service进程
虽然不直接与用户内容关联,但会执行一些用户关心的操作,例如后台播放音乐,下载数据等
若系统不足以维持前台进程和可见进程,才会牺牲服务进程空间

4.后台进程

包含用户不可见的Activity的进程,这些进程对用户体验没有直接影响,可以随时终止他们,以回收内存资源
系统通过LRU(最近最少使用)列表进行多个后台进程的管理,确保最近使用的Activity最后被终止

空进程

进程不含有任何应用组件,该进程主要作用是缓存,以改善在此进程中运行组件的启动时间。系统会经常终止此类经常

线程

Android是单线程模型,我们创建的Service,Activity以及Broadcast均是在一个主线程处理,这里我们看理解为UI线程。(应用程序是一个默认的单线程单任务程序

UI Thread中运行着许多重要的逻辑,如系统事件处理,用户输入事件处理,UI绘制,Service,Alarm等

我们编写的代码穿插在主线程的逻辑中,比如对用户触摸事件的检测和响应,对用户输入的处理,自定义View的绘制等。如果我们插入的代码比较耗时时,如网络请求或数据库读取,就会阻塞Ui线程其他逻辑的执行,从而导致界面卡顿。

如果卡顿时间超过5秒,系统就会报ANR错误。所以,执行耗时的操作,我们需要另起线程执行。

在新线程执行完耗时的逻辑后,往往需要将结果反馈给界面,进行UI更新。Android的UI toolkit不是线程安全的,不能在非UI线程进行UI的更新,所有对页面的更新必须在UI线程进行

Android的单线程模式遵从两个原则
1.不要阻塞UI线程
2.不要在UI线程外访问UI组件

创建线程:基础操作都在UI线程中运行,耗时操作可以创建新的线程去完成

继承Thread类

实现Runnable接口

Android提供了四种常用的操作多线程的方式,分别是:
1.Handler+Thread
2.AsuncTask
3.ThreadPoolExecutor
4.IntentService

实现多任务

原理:在Android中,我们会吧除UI线程外的,其他所有的线程都叫工作线程,也就是说Android只会存在两种线程:UI主线程(UI Thread)和工作线程(work Thread)
我们吧耗时的操作放在工作线程中去做。操作完成后,再通知UI主线程做出相应的相应。
这就需要掌握线程通信的方式。在Android中提供了两种线程间的通信方式:

AsyncTask机制

AsyncTask是 Android框架提供的异步处理的辅助类,它可以实现耗时操作在其他线程执行,而处理结果在Main线程执行

屏蔽掉了多线程和后面要讲的Handler的概念,进行了较高程度的封装。

使用AsyncTask的代码很容易被理解,因为他们都有一些具体特定职责的方法,如:预处理的onPreExecute,后台执行任务的方法DoInBackground,更新进度的方法publishProgress,返回结果的方法onPostExecute等等

Handler机制
Handler机制是通过消息队列进行通信的机制,通过使用Handler,Looper,MessageQueue和Message这几个类协调来完成
Handler:在Android里负责发送 和处理消息,通过他可以实现其他线程与Main线程之间的消息通讯。
Looper:负责管理线程的消息队列和消息循环
Message:线程间通讯的消息载体。Message充当消息封装的功能,里面可以存任何你想要船体的消息。
MessageQueue:消息队列,先进先出,他的作业是保存有待线程处理的消息

在这里插入图片描述

Looper类:Android系统中用来封装消息循环和消息队列的一个类,负责管理线程的消息队列和消息循环
线程通过looper对象可以读写某个消息循环队列
Looper.myLooper():得到当前线程的Looper对象
Looper.getMainLooper();可以获得当前进程的主线程的Looper对象
Looper.prepare(): 创建消息队列
Looper.loop() 进入消息循环

Handler类:UI主线程在创建时会被自动创建一个消息队列和消息循环,主线程的Looper通过创建一个Handler对象,对外界提供了消息队列的渠道

-主线程通过Handler.hanleMessage()读取消息队列中的消息
-工作线程通过方法发送消息到主线程的消息队列
Handler.sendMessage()
Handler.post()

Android实现多线程的两种操作方式
  1. 第一种是创建新线程Thread,用Handler负责线程间的通信和消息。
          在新的线程中调用主线程的Handler的postxxx和sendmessage方法来实现与主线程进行通信。
          使用post方法实现多任务的主要步骤如下:
                (1)创建一个Handler对象
                (2)将要执行的操作写在线程对象的run方法中
                (3)使用post方法运行线程对象
                (4)如果需要循环执行,需要在线程对象的run方法中再次调用post方法。
  2. 第二种方式AsyncTask异步执行任务。

Handler类的post***方法
1.Handler.post(Runnable r)
2.Handler.postDelayed()
3.Hanler.removeCallBacks()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值