Android多线程和并发
AndroidConqueror
奋斗不止,量变引起质变
展开
-
HandlerThread的使用方法和原理
我们如果想要在子线程中使用Handler,必须要手动创建一个Looper(原理已经在前面关于Handler和Looper的博客中介绍过:http://blog.csdn.net/whsdu929/article/details/52487605):new Thread(){ @Override public void run() { Looper.prepare();原创 2016-09-12 16:30:52 · 612 阅读 · 0 评论 -
IntentService的使用方法和原理
IntentService继承了Service,它是一个抽象类,用于执行后台的耗时任务,当任务结束后它会自动停止。由于IntentService是服务,所以它的优先级比普通的线程要高很多,所以它适合执行一些高优先级的后台任务。当使用IntentService时,我们需实现onHandleIntent(Intent intent)方法,在里面就可以执行后台任务,比如下载、访问数据库、IO操作等。 为原创 2016-09-12 15:48:33 · 770 阅读 · 0 评论 -
AsyncTask的使用方法和原理
AsyncTask的本质实际仍是传统的线程,它封装了Thread和Handler,底层用到了线程池。它在线程池中执行后台任务,支持把执行的进度和最终结果传递给主线程并在主线程中更新UI。但是AsyncTask不适合执行特别耗时的后台任务,对于特别耗时的任务,建议直接使用线程池(原因请参考下面的工作原理分析)。使用方法AsyncTask是一个抽象的泛型类,它的泛型参数有三个:public abstra原创 2016-09-11 19:08:10 · 556 阅读 · 0 评论 -
android多线程数据存储 - ThreadLocal的工作原理
定义ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,存储以后,只能在该线程中可以获取到存储的数据,对于其他线程来说无法获取。使用场景某些数据以线程为作用域并且在不同线程有不同的数据时。比如每个线程要使用Handler需要创建Looper,而且每个线程的Looper是不同的,所以使用ThreadLocal可以轻松的实现Looper在线程中的存取。复杂逻辑下的对象原创 2016-09-09 16:24:55 · 1263 阅读 · 0 评论 -
android消息机制 - Handler、Looper原理解析
android的消息机制就是指Handler、MessageQueue和Looper的工作过程。需要传递消息时,由Handler会调用MessageQueue的enqueueMessage方法将消息放入消息队列中,Looper会不断从队列里取消息,取出以后再交给Handler去处理。Handler在创建时要使用当前线程的Looper来构建内部的消息处理系统,所以如果当前线程没有Looper,就会报错原创 2016-09-09 15:24:49 · 815 阅读 · 0 评论 -
android多线程下载
使用单线程下载文件会比较慢,如果使用n个线程,那么时间就会缩短为1/n,每个线程只下载其中的一段,都下载完以后再把这n段拼接起来就ok了。下面简单介绍一下多线程下载的原理和实现。多线程下载的关键是怎样从服务器只获取文件的一部分,而不是整个文件。这里需要设置request header的一个属性:Range。conn.setRequestProperty("Range", "bytes=" + sta原创 2016-08-29 12:01:40 · 694 阅读 · 0 评论 -
android线程池的使用方法和原理
线程是操作系统调度的最小单元,同时线程又是一种受限的系统资源,即线程不可能无限制的产生,并且线程的创建和销毁都会有相应的开销。当系统中存在大量的线程时,系统会通过时间片轮转的方式调度每个线程,因此线程不可能做到绝对的并行,除非CPU核心数>线程数,一般来说是不可能的。试想一下如果在一个进程中频繁的创建和销毁线程,显然不是高效的做法。正确的方法是使用线程池,一个线程池会缓存一定数量的线程,做到线程重用原创 2016-09-12 20:34:09 · 1779 阅读 · 1 评论