Android并发编程之AsyncTask(异步任务)学习
[TOC]
概述由于Android的特性,如果要执行耗时操作,则必须方法子线程中执行。如果在主线程中执行耗时操作那么会导致应用程序无法及时响应。除了Thread可以开启子线程外,Android中扮演线程角色的有很多。比如:AsyncTask和IntentService(开启任务线程执行耗时操作),同时HandlerThread(含有handler的Thread)也是一种特殊的线程。本篇文章主要介绍AsyncTask,一个执行异步任务的类,底层是采用线程池实现的。而IntentService和HandlerThread。他们的底层则直接使用了线程。
一、Android中的线程在操作系统中,线程是操作系统调度的最小单元,同时线程又是一种受限的系统资源,即线程不可能无限制地产生,并且线程的创建和销毁都会有相应的开销。当系统中存在大量的线程时,系统会通过会时间片轮转的方式调度每个线程,因此线程不可能做到绝对的并行。
如果在一个进程中频繁地创建和销毁线程,显然不是高效的做法。正确的做法是采用线程池,一个线程池中会缓存一定数量的线程,通过线程池就可以避免因为频繁创建和销毁线程所带来的系统开销。关于 ...
Android中ThreadLocal的工作原理
[TOC]
文章参考:http://blog.csdn.net/singwhatiwanna/article/details/48350919
概述提到消息机制大家应该都不陌生,在日常开发中不可避免地要涉及到这方面的内容。从开发的角度来说,Handler是Android消息机制的上层接口,这使得开发过程中只需要和Handler交互即可。Handler的使用过程很简单,通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。很多人认为Handler的作用是更新UI,这说的的确没错,但是更新UI仅仅是Handler的一个特殊的使用场景,具体来说是这样的:有时候需要在子线程中进行耗时的IO操作,这可能是读取文件或者访问网络等,当耗时操作完成以后可能需要在UI上做一些改变,由于Android开发规范的限制,我们并不能在子线程中访问UI控件,否则就会触发程序异常,这个时候通过Handler就可以将更新UI的操作切换到主线程中执行。
因此,本质上来说,Handler并不是专门用于更新UI的,它只是常被大家用来更新UI。Android的消息机制主要是指Handler的运行机制,Han ...
Android并发编程之HandlerThread学习
[TOC]
概述初次看到HandlerThread的名字,我们可能会联想到Handler和Thread这两个类,没错,它其实就是跟Handler和Thread有莫大的关系。HandlerThread继承自Thread,所以它本质上就是一个Thread,那既然是Thread,那么必然就应该是用来处理耗时任务,而且专门用来处理Handler中的耗时任务。
HandlerThread简介看看官方对它的解释:
++Handy class for starting a new thread that has a looper.The looper can then be used to create handler classes.Note that start() must still be called.++
大致就是说HandlerThread可以创建一个带有looper的线程,looper对象可以用于创建Handler类来进行来进行调度,而且start()方法必须被调用。
在Android开发中,不熟悉多线程开发的人一想到要使用线程,可能就用
1new Thread(){… ...
Android并发编程之IntentService的学习
[TOC]
概述IntentService是一种特殊的Service,它继承了Service并且它是一个抽象类,因此必须创建它的子类才能使用IntentService。
IntentService可用于执行后台耗时的任务,当任务执行后它会自动停止,同时由于IntentService是服务的原因,这导致它的优先级比单纯的线程要高很多,所以IntentService比较适合执行一些高优先级的后台任务,因为它优先级高不容易被系统杀死。
在实现上,IntentService封装了HandlerThread和Handler,这一点可以从它的onCreate方法中看出来,如下所示。
12345678910111213141516@Overridepublic void onCreate() { // TODO: It would be nice to have an option to hold a partial wakelock // during processing, and to have a static startService(Context, Intent) ...
Android之Thread的线程学习
[TOC]
Thread的基础学习这个是Android中最简单、最常见的异步方法,但是除了实现简单之后,基本上没有其他的优点了。
缺点:
不容易复用,频繁创建及销毁线程开销很大
复杂场景不容易使用
Android线程优先级Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //设置线程优先级为后台,这样当多个线程并发后很多无关紧要的线程分配的CPU时间将会减少,有利于主线程的处理,有以下几种:
12345678910int THREAD_PRIORITY_AUDIO //标准音乐播放使用的线程优先级int THREAD_PRIORITY_BACKGROUND //标准后台程序int THREAD_PRIORITY_DEFAULT // 默认应用的优先级int THREAD_PRIORITY_DISPLAY //标准显示系统优先级,主要是改善UI的刷新int THREAD_PRIORITY_FOREGROUND //标准前台线程优先级int THREAD_PRIORITY_LESS_FAVORA ...
面试题-Android程序最多可以创建多少个线程
[TOC]
面试题:Android一个APP里面最少有几个线程?最多可以常见多少个线程?
一个进程最少有几个线程?
Android一个进程里面最少包含5个线程,分别为:
main线程(主线程)
FinalizerDaemon线程:终结者守护线程。对于重写了成员函数finalize的对象,它们被GC决定回收时,并没有马上被回收,而是被放入到一个队列中,等待FinalizerDaemon守护线程去调用它们的成员函数finalize,然后再被回收。
FinalizerWatchdogDaemon线程:监控终结者守护线程。用来监控FinalizerDaemon线程的执行。一旦检测那些重定了成员函数finalize的对象在执行成员函数finalize时超出一定的时候,那么就会退出VM。
HeapTaskDaemon线程:堆栈守护线程。用来执行堆栈的操作,也就是用来将那些空闲的堆内存归还给系统。
ReferenceQueueDaemon线程:引用队列守护线程。我们知道,在创建引用对象的时候,可以关联一个队列。当被引用对象引用的对象被GC回收的时候,被引用对象就会被加入到其创建时关联的队列 ...
Android之查看Android系统相关的属性
[TOC]
123456789101112131415161718192021222324252627282930313233|msmnile_gvmq:/ $ cat /system/product/etc/build.prop ##################################### from generate-common-build-props# These properties identify this partition image.####################################ro.product.product.brand=qtiro.product.product.device=msmnile_gvmqro.product.product.manufacturer=QUALCOMMro.product.product.model=msmnile_gv ...
Android音视频学习之视频编码
[TOC]
概述• MPEG系列:(由ISO[国际标准化组织]下属的MPEG[运动图像专家组]开发)视频编码方面主要是MPEG1(VCD用的就是它)、MPEG2(DVD使用)、MPEG4(DVDRIP使用的都是它的变种,如DivX、XviD等)、MPEG4 AVC(正热门)。其还有音频编码方面,主要是MPEG Audio Layer 1/2、MPEG Audio Layer 3(大名鼎鼎的MP3)、MPEG-2 AAC 、MPEG-4 AAC等。注意,DVD音频没有采用MPEG的。
• H.26X系列:(由ITU[国际电传视讯联盟]主导,侧重网络传输,注意,只有视频编码)包括H.261、H.262、H.263、H.263+、H.263++、H.264(就是与MPEG4AVC合作的结晶)。
常见的音频编码格式有AAC、MP3、AC3,下面分别进行介绍。
多媒体播放组件(Android、iOS)Android多媒体播放组件包含MediaPlayer、MediaCodec、OMX、StageFright、AudioTrack等,下面分别进行介绍。
• MediaPlayer:播放控 ...
Android音视频多媒体学习路线
[TOC]
概述那么,作为一个音视频零基础的人来说, 开发一款短视频 SDK 到底需要具备哪些知识呢?
基础知识1、你必须要有 「C/C++」 开发语言基础,可以看我之前写的文章
音视频学习 (一) C 语言入门
https://juejin.im/post/6844904022827073543
音视频学习 (二) C++ 语言入门
https://juejin.im/post/6844904039407173646
2、接下来就需要掌握 「JNI」 基础了
音视频学习 (三) JNI 从入门到掌握
https://juejin.im/post/6844904041235873799
3、有了 「C/C++/JNI」 基础,你还要学会如何交叉编译 「FFmpeg」 等 C/C++ 库
音视频学习 (四) 交叉编译动态库、静态库的入门学习
https://juejin.im/post/6844904046067712008
音视频学习 (五) Shell 脚本入门
https://juejin.im/post/68449040466591252 ...
音视频开发之三种方式绘制图片
[TOC]
文章参考:
https://mp.weixin.qq.com/s?__biz=MzU5NjkxMjE5Mg==&mid=2247483704&idx=1&sn=b7de912f25ea94c70668499fd7c40c09&chksm=fe5a3017c92db90143af0106e21574b375cc9633abaa711eb9aae9ca1deb7979a68aea459f91&scene=178&cur_album_id=1555170733142622209#rd
概述在android开发中我们最常使用的绘制图片的方式就是ImageView,设置src。那么有没有其他方案可以实现图片的绘制呐?
三种方案
通过Imageview设置setImageBitmap
1234final String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "Pictures" + File.separa ...