Android中线程应用

Android 中的线程应用

一、Android中线程应用基础

(一)何为线程(Thread)相关概述(线程,进程)

1. 线程是进程中的一个顺序的执行流,是进程中的一个最小的执行单位,系统中所有操作执行都是运行在某个线程中,一个线程中假如有多个操作,这些操作是顺序执行

(二)何为进程

1.  进程是程序中正在运行的程序,一个多任务操作系统中,可以并发执行多个进程,一个进程可以启动多个线程,每个进程都有自己独立的内存空间,多个线程可以共享同进程中的内存空间

     (三)何为并发(进程、线程)

1. 宏观(宏观上是同时)

2. 微观(微观上是顺序)

     (四)多线程并发执行的优势、劣势?

1.优势:提高系统的执行效率,改善用户体验

2.劣势:数据不安全,调试维护困难

(三)Java中线程对象的创建

1. java中线程的类型:Thread

2. Java中线程对象创建:参考构造方法

1)Thread()

2)Thread(Runnable target)

3.java中线程的启动:调用线程对象的start方法

4.Java中线程启动以后一旦获得了CPU就会执行线程对象的run方法,可以在此方法中添加我们的自己的业务

 

(四)Java中线程对象的状态及相关方法

1. 新建状态(创建新的线程)

2. 就绪状态(可运行状态,可以获得CPU)

3. 运行状态(线程正在执行)

4. 阻塞状态(线程等待,此时不能获得CPU,并且处于暂停状态)

5. 死亡状态(线程结束)

 

 线程对象相关方法

1)start()启动线程,此时线程处于就绪状态

2)run()线程在运行时会执行此方法

3)sleep() 线程此时会让出CPU,处于阻塞状态,醒了会继续执行

4)join(long time) 让调用此方法的线程会优先执行

5)setDaemon(boolean flag)设置线程为守护线程(服务线程),一定要在启动执行进行设置,当只有守护线程在执行时,运行一段时间会自动结束

6)setName(String name) 给线程起名  

7)getName 获取线程名

8)static Thread currentThread() 获得当前线程

9)isAlive() 判断线程是否处于活动状态

10)setPriority(....)设置优先级(告诉操作系统尽量让优先级高的先执行)

11)interrupt()唤醒调用此方法的线程

12)...........

二、Android中线程同步

(一)何为线程同步

所谓线程同步指的是多个并发执行的线程在共享数据集上的互斥与协作(通讯)

互斥:多个线程在共享数据集上排队执行

协作:多个线程在共享数据集上进行通讯

(二)线程同步应用的场合及目的

1. 存在多个线程(并发)

2. 存在共享数据(多个线程之间有共享,多线程都可以访问并操作此数据)

3. 共享数据集上的操作非原子操作(操作过程中存在多个步骤)

(三)线程同步应用的目的

1. 保证数据的安全(正确)

2. 保证数据业务的合理性

(四)线程通讯时的互斥

 

1. 同步方法(方法上面加synchronized修饰)

1) 静态方法(默认使用类对象作为对象锁)

2) 非静态方法(默认使用this作为对象锁)

2. 同步代码块()

synchronized (对象锁){共享数集} 对象锁必须是唯一的,一般用this

1)StringBuffer是一个线程安全的StringBuilder

2)Vector是一个线程安全的ArrayList

3)HashTable是一个线程安全的HashMap,但HashTable性能不高。

4)ConcurrentHashMap是一个线程安全,且在并发

环境效率比较高的集合(此对象采用的是局部加锁技术)

(五)线程同步中的协作

1.何为线程协作

此线程协作是多个线程在共享数据集上的一种通讯(交互)

2.线程协作的目的

1) 数据的正确

2) 数据的合理

 3.java中线程协作的实现

Java中线程的协作构建于线程互斥的基础之上,要借助Object类中的wait,notify,notifyall方法在同步代码块或同步方法中实现相关通讯

相关含义:

① wait():调用此方法的线程会阻塞同时会释放对象锁

② notify()/notifyall:调用此方法的线程会通知处于等待状态且具备相同锁的线程对象开始执行

 

相关应用:

a. wait,notify()/notifyall必须应用在同步代码块或同步方法中

b. wait,Notify()/notifyall必须由对象锁调用

 

 

 

三、Android中线程消息应用模型

(一)Android中多线程应用机制

1. Android中所有耗时操作,都应在工作线程执行

2. Android中所有的UI操作(输入,事件....)都要在主线程(UI线程)执行

 FAQ?

Android中不同线程有不同职责,那么这些线程之间是如何通讯的

 

 

(二)Android中的消息模型

1. Android中线程之间的交互,通常是要求尽量不要阻塞主线程的环境中执行的,要想实现这样的方案,在Android中是要借助如下几个对象

1) Message (消息对象:数据的载体)

① Obj

② what

③ ..

④ obtain(..) 从消息池获得消息

⑤ sendToTarget()

2) messageQueue (消息队列:存储多个消息对象)

3) Looper (迭代器:迭代消息队列)

① prepare()

② myLooper()

③ getMainLooper()

④ loop()

⑤ quit() 工作线程的looper不使用以后一定要记得quit

4) Handler (处理器:发送,处理消息)

sendMessage()

sendEmptyMessage()

pose

postDelay

 

以上几个对象的执行过程构成了Android线程应用消息模型

这些对象的伪代码实现:

class Message{

    Object obj;

    int what;

}

class MessageQueue{

    Message[] msgQ=new Message[10];

    void put(Message msg){}

    Message take(){}

    .......

}

 

class Looper{

     MessageQueue msgQ;

     void loop(){while(true){msg.take(),.....}}

}

 

class Handler{

    void sendMessage(Message msg){}

    void handleMessage(Message msg){}

    .......

}

FAQ

1)Android中主线程(UI线程)默认会有一个Looper对象,可以调用Looper.getMainLooper()

2)Android中所有线程在创建时,默认没有looper

3)Android汇总每个线程最多有一个Looper对象

4)Android中的Looper对象创建时会创建一个消息队列,用于存储多个消息

5)Android中的一个线程可以创建多个handler,由哪个Handler发送消息就由哪个Handler处理消息

6)........

runOnUIThread(Runnable r){} 此方法无论在哪里调用都会运行在主线程,所以可以在此方法中执行一些UI的更新操作

(三)Android中消息模型应用案例

1. 工作线程发消息给主线程,主线程更新UI

1) 工作线程

2) 主线程(主线程启动时默认创建了一个Looper)

3) 工作线程发消息给主线程

 

记住:

a)给谁发消息就获得与谁的Looper关联的Handler

 

Activity

runOnUIThread(Runnabke r){} 不管是不是在主线程,重写此方法是运行在主线程,也就是说无论在哪里调用,都会运行在主线程,所以可以在此方法中执行一些UI的更新操作

 

 

四、Android中线程异步任务对象

AsyncTask对象实现了对消息模型应用的封装,采用异步通讯机制实现线程之间的交互,我们在使用此类时通常会构建此类的子类对象,然后重写相关方法

 

abstract class AsyncTask<Params,Progress,Result>{}  此类中的泛型参数决定了此类中某些方法的参数类型及这些方法的返回值类型

此类相关方法:

 

1. doInBackground

 


2. onPreExecute

 


 

3. onPostExecute

 

4. publishProgress

 

 

5. onProgressUpdate

 

 

6. cancel(...)

7. execute(...)

8. ............


 

 

   在查询给cursor 赋值时,注意参数  

 

五、Android中线程池对象应用

(一)线程池是什么

1. 内存中的一块区域

2. 此区域中允许存储多个线程对象

类似 整数池、字符串池、消息池.......

(二)线程池应用的目的及场合

目的是为了提高系统的整体运行性能,此池中的线程允许重复使用

应用场合

多次使用线程对象的场合(例如下载多个文件)

 

(三)Android中线程池对象的实现

1. Executor(线程池对象顶层接口)

ExecutorService(接口)

ScheduledExecutorService(接口)

ThreadPoolExecutor(线程池具体对象类型)

 

............

Ø Timer类的使用

 

2. Executors(工具类)

并发执行与顺序执行

 

 

 

六、Android中异步图片加载及相关优化

(一)图片的压缩(图片太大,可能会导致内存溢出)

 

 






 


(二)异步加载(尽量不要阻塞主线程,提高系统使用的流畅度)




WeakReference<ImageView> 弱引用,退出时会自动销毁,避免在正在加载时退出,还会继续加载占用activity

a.工作线程(借助异步任务对象AsyncTask

b.内存泄漏(内部类,弱引用)

c.并发加载(数据不一致)

C.1)数据绑定(一个ImageView,一个异步任务对象,中间涉及到drawable

C.1.1)创建一个drawable类型(AsyncDrawable

C.1.2)实现drawable与异步任务对象的绑定(弱引用)

C.1.3)实现drawable对象与imageview对象的绑定

C.2)数据更新(逻辑判断)

(三)图片的缓存(提高浏览的速度,减少流量的使用)LruCache

1. Android中使用缓存的目的

1) 提高加载的速度,改善用户体验

2) 减少手机流量的应用,为用户节省成本

2. Android中数据缓存位置

1) 内存LruCache

2) 外存

缓存(DiskLruCache):自学(学到网络以后可以去实现一下)

LruCache

 

 

3.Android 中图片内存缓存应用案例?(listview中图片缓存实现)

1)首先检测内存是否有缓存的数据

2)内存中有缓存数据则直接显示数据

3)内存中没有缓存数据则启异步任务加载并写到缓存。

相关API总结:

 

1.Thread,Runnable,ThreadLocal,BlockingQueue,...

2.Message,MessageQueue,Looper,Handler,HandlerThread,...

3.AsyncTask(execute(params...p),exeucte(Runnable r),

executeOnExecutor(....),cancel)

4.Executors,Executor(ExecutorService,ScheduledExecutorService,

ThreadPoolExecutor,....)

5.Timer,TimerTask,....

6.Drawable,WeakReferences,LruCache,DiskLruCache,........

7.Activity (runOnUIThread(Runnable r));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值