Android多线程

来源:互联网 发布:西西软件乐园下载 编辑:程序博客网 时间:2024/05/16 07:06

从接触Android开始,就没深究AsyncTask,那会只是觉得Handler+多线程就可以解决Android单线程保护的问题,但最近项目涉及到高速I/O操作,UI线程出现假死现象,才意识到,多线程问题,不是一味的开启线程,亦或线程池调度能解决,有些情况下,多线程(滥用)会给上下文带来过重的负担,这是就需要换个思路。(过度的相信Android的线程调度机制不如从程序架构开始优化,避免CPU过重的负担),这是,才决定转向AsyncTask。

一  关于Android多线程背景

先看GoogleAPI关于线程介绍 

Additionally, the Andoid UI toolkit is not thread-safe. So, you must not manipulate your UI from a worker thread—you must do all manipulation to your user interface from the UI thread. Thus, there are simply two rules to Android's single thread model:

  1. Do not block the UI thread
  2. Do not access the Android UI toolkit from outside the UI thread

UI线程非线程安全,在工作线程中不能操作UI,恪守Android单线程模型两个原则:

1. 不能阻塞UI线程

2. 工作线程不能更新UI控件

为了不阻塞UI线程,需要将耗时操作移出UI线程,方法:工作线程 + AsyncTask

为了实现UI控件更新,需要实现工作线程与UI线程的交互,方法:handler + DMA(准确的讲,DMA属于AsyncTask的硬件实现基础)

二  工作线程+handler

关于实现网上介绍资源很多,这里不多做介绍,只讲自己的理解。

开启工作线程最终还是与UI线程顺序执行,单处理器架构下并未实现真正并发,由于本人从事工业领域嵌入式Android,所以必须充分考虑由于成本问题造成的单核架构下采用该方法所面临的问你,一些涉及IO(端口、内存中一些地址)操作时,需要考虑工作线程过多时带来的UI响应问题。

三 AsyncTask+DMA

DMA,即直接访问地址,也就是说,拥有DMA功能的硬件(硬盘、光驱,甚至网卡、声卡、显卡中支持DMA)在与内存进行数据交互的时候可以不通过CPU,这样从硬件层次规避了多线程(单处理器)关于CPU竞争的问题,是单处理器架构下实现真正意义并行的有效途径。

关于AsyncTask实现,后续项目完成会有进一步说明。





0 0
原创粉丝点击