自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AndroidConqueror的博客

奋斗不止,量变引起质变

  • 博客(27)
  • 收藏
  • 关注

原创 使用UncaughtExceptionHandler捕捉应用的crash信息

一个Android应用很难做到完全不会出现crash。当应用发生crash时,程序通常会无法继续运行,但如果能知道发生crash的原因,那么就可以修复问题。可是很多时候当产品发布后,用户在使用过程中发生了crash时,很难获取到crash的信息,使得问题代码没法被定位,这非常不利于产品的持续发展。我们可以通过实现UncaughtExceptionHandler这个接口来捕捉应用的crash信息。当应

2016-09-28 16:43:25 622

原创 ListView和GridView列表滑动卡顿问题的优化方法汇总

ListView和GridView列表在滑动时出现卡顿现象困扰了很多开发者,下面我们来总结一下优化方案: 1. 使用ViewHolder在adapter的getView方法中对convertView setTag(viewHolder),这个是大部分开发者都会去用的方案,它的原理是避免重复通过inflate方法去渲染UI,只要set了tag,view就可以被重用,这里不做详细赘述了。 2. ge

2016-09-28 14:53:55 8273

原创 Android的缓存策略:LruCache和DiskLruCache

当用户要浏览微信的某张图片或视频时,第一次肯定需要从网络上下载下来才能看,但如果第二次去浏览,还要从网络上下载就不合适了,用户体验差,更重要的是浪费了用户的流量。当图片首次下载下来的时候,我们需要对图片做一下缓存,这样再次读它的时候直接从缓存中取就可以了。图片缓存对于目前的主流图片加载框架(比如UniversalImageLoader)是最最基础的功能了。缓存通常分为两种:内存缓存和硬盘缓存。当应用

2016-09-26 18:20:24 1331

原创 listview数据错乱、重复的原因分析与解决方案

目前我们使用listview展示数据时,adapter的getView方法通常使用convertView.setTag(viewHolder)的方式来避免出现卡顿的情况,这种方式能使convertView得以复用,避免重复的调用inflate方法渲染界面。但是,如果使用不当,可能会出现数据错乱、重复的问题,比如下面这个demo:这个demo是要listview在偶数行只显示大写字母,在奇数行既显示大

2016-09-21 10:27:47 13822 5

原创 HashMap的底层工作原理和并发问题

源码分析首先来看下HashMap一个典型的构造函数:transient HashMapEntry<K, V>[] table;public HashMap(int capacity) { if (capacity < 0) { throw new IllegalArgumentException("Capacity: " + capacity); } if (capac

2016-09-19 20:26:31 2641

原创 Bitmap的高效加载,避免内存溢出

Android对单个应用有内存限制,比如16MB,这导致加载Bitmap时很容易出现内存溢出:java.lang.OutofMemoryError:bitmap size exceeds VM budget因此我们需要考虑如何高效加载bitmap,避免发生内存溢出。首先回顾一下如何加载一个bitmap:BitmapFactory提供了四类方法:decodeFile、decodeResource、de

2016-09-13 11:31:07 2588

原创 android线程池的使用方法和原理

线程是操作系统调度的最小单元,同时线程又是一种受限的系统资源,即线程不可能无限制的产生,并且线程的创建和销毁都会有相应的开销。当系统中存在大量的线程时,系统会通过时间片轮转的方式调度每个线程,因此线程不可能做到绝对的并行,除非CPU核心数>线程数,一般来说是不可能的。试想一下如果在一个进程中频繁的创建和销毁线程,显然不是高效的做法。正确的方法是使用线程池,一个线程池会缓存一定数量的线程,做到线程重用

2016-09-12 20:34:09 1727 1

原创 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 598

原创 IntentService的使用方法和原理

IntentService继承了Service,它是一个抽象类,用于执行后台的耗时任务,当任务结束后它会自动停止。由于IntentService是服务,所以它的优先级比普通的线程要高很多,所以它适合执行一些高优先级的后台任务。当使用IntentService时,我们需实现onHandleIntent(Intent intent)方法,在里面就可以执行后台任务,比如下载、访问数据库、IO操作等。 为

2016-09-12 15:48:33 748

原创 AsyncTask的使用方法和原理

AsyncTask的本质实际仍是传统的线程,它封装了Thread和Handler,底层用到了线程池。它在线程池中执行后台任务,支持把执行的进度和最终结果传递给主线程并在主线程中更新UI。但是AsyncTask不适合执行特别耗时的后台任务,对于特别耗时的任务,建议直接使用线程池(原因请参考下面的工作原理分析)。使用方法AsyncTask是一个抽象的泛型类,它的泛型参数有三个:public abstra

2016-09-11 19:08:10 527

原创 git换行符自动转换导致整个文件被修改的解决方案

不少开发者可能遇到过这个问题:从git上拉取服务端代码,然后只修改了一处地方,准备提交时,用diff软件查看,却发现整个文件都被修改了。这是git自动转换换行符导致的问题。原因不同操作系统使用的换行符是不一样的。Unix/Linux使用的是LF,Mac后期也采用了LF,但Windows一直使用CRLF【回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)】作为换行符。而

2016-09-09 19:55:59 17098 1

原创 android多线程数据存储 - ThreadLocal的工作原理

定义ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,存储以后,只能在该线程中可以获取到存储的数据,对于其他线程来说无法获取。使用场景某些数据以线程为作用域并且在不同线程有不同的数据时。比如每个线程要使用Handler需要创建Looper,而且每个线程的Looper是不同的,所以使用ThreadLocal可以轻松的实现Looper在线程中的存取。复杂逻辑下的对象

2016-09-09 16:24:55 1236

原创 android消息机制 - Handler、Looper原理解析

android的消息机制就是指Handler、MessageQueue和Looper的工作过程。需要传递消息时,由Handler会调用MessageQueue的enqueueMessage方法将消息放入消息队列中,Looper会不断从队列里取消息,取出以后再交给Handler去处理。Handler在创建时要使用当前线程的Looper来构建内部的消息处理系统,所以如果当前线程没有Looper,就会报错

2016-09-09 15:24:49 771

原创 JVM内存模型与垃圾回收机制

JVM的定义和基本原理Java语言是通过JVM来实现平台无关性的,编译器只需生成.class的字节码文件,JVM就可以把它们解释成具体平台的机器指令执行。也就是说,JVM屏蔽了具体平台相关的信息,它能把字节码文件映射到本地CPU的指令集或操作系统的调用,对于不同的操作系统有着不同的映射规则。这就是Java语言能够“一处编译,到处运行”的原因。首先来说一下JDK、JRE、JVM的区别: JDK =

2016-09-06 19:10:11 1093

原创 android下载的断点续传的功能的实现

前一篇博客介绍了android的多线程下载: http://blog.csdn.net/whsdu929/article/details/52351807下面来介绍一下下载过程中断点续传功能的实现。所谓的断点续传就是可以在下载过程中随时暂停下载,恢复下载时会从上次中断的地方继续下载,而不是从头开始。断点续传的原理是:每次暂停下载时,记录保存每个线程当前下载到的位置,恢复下载时直接找到这个位置开始继

2016-08-29 15:02:13 782

原创 android多线程下载

使用单线程下载文件会比较慢,如果使用n个线程,那么时间就会缩短为1/n,每个线程只下载其中的一段,都下载完以后再把这n段拼接起来就ok了。下面简单介绍一下多线程下载的原理和实现。多线程下载的关键是怎样从服务器只获取文件的一部分,而不是整个文件。这里需要设置request header的一个属性:Range。conn.setRequestProperty("Range", "bytes=" + sta

2016-08-29 12:01:40 655

原创 封装android http框架

目前有几个开源的android http框架,比如volley、android-async-http,对于初学者来说听上去可能很高大上,实际就是对常用的网络请求代码做了一下封装,看过一套框架源码以后就会感觉没那么复杂,我们完全可以自己封装一个http框架。需求分析: 1. 支持http协议:GET、POST、PUT、DELETE 2. 支持apache的HttpClient和原生的HttpURL

2016-08-26 16:54:11 785

原创 View的事件分发机制

要想控制View对点击事件的响应,就需要了解View的事件分发机制。而View的事件分发机制无非就是研究复写下面三个方法,只要明白它们的作用原理,就可以随心所欲的写出满足自己意愿的交互代码:1.dispatchTouchEvent View有一个方法叫dispatchTouchEvent,这个方法用于进行事件的分发,只要点击事件传到了这个View,那么这个方法就会被调用。 这个方法的伪代码是:p

2016-08-25 17:24:17 415

原创 【持续更新】android易错知识点、相见恨晚的知识点整理

下面整理一下本人在android开发过程中遇到过的 易错知识点、相见恨晚的知识点,本帖会持续更新^_^1. ListView的item点击事件:public void onItemClick(AdapterView parent, View view, int position, long id)其中这个position参数,如果ListView有一个HeaderView,那么列表

2016-08-11 11:13:40 517

原创 使用Scroller实现View的弹性滑动

View有scrollTo、scrollBy方法,但是滑动是瞬时的,比较僵硬。可以通过Scroller来实现View的弹性滑动。ScrollView就有smoothScrollTo和smoothScrollBy方法,这两个方法实现的就是弹性滑动的效果,它们内部实际也是用了Scroller。Scroller的典型用法:

2016-08-08 20:07:12 2013

原创 View的坐标系以及X、rawX、translationX、scrollX的区别

简单介绍一下View的坐标系:view的位置由left、top、right、bottom四个属性决定,这几个坐标可以通过getLeft()、getTop()、getRight()、getBottom()获取。注意这四个坐标是相对坐标,即相对于父容器的坐标。当view发生移动时,这几个坐标是不变的。从Android 3.0开始,增加了几个参数:x、y、translationX

2016-08-08 15:43:29 10502 1

原创 android面包屑导航栏的实现

面包屑导航的效果如下:点击面包屑上标蓝的文字,可以直接返回到对应的级别。比如点击“第2层”,就能直接返回到第2层下的目录,而无须依次点返回。面包屑导航的原理是通过FragmentTransaction去实现的,下面简单介绍一下实现原理。页面分为两部分:顶部的自定义导航栏view和下方的ListFragment,点击fragment的item会进入下一层L

2016-06-10 15:12:17 6326 2

原创 Android的MVP框架

首先来说一下MVC和MVP的区别:MVC(Model-View-Controller),这种模式下三种模型的交互关系如下:缺点:view可以直接访问model(比如我们经常在activity中直接操作SQLite、SharedPreference中的数据),同时view中可能会包含业务逻辑(比如我们经常把一个点击事件的处理写在activity里,这样就使得view层和con

2016-05-17 16:24:00 491

原创 AlertDialog点击按钮后对话框不消失的处理方法

我们在使用AlertDialog时,无论点击“确定”(PositiveButton)还是“取消”(NegativeButton),对话框都会消失,这其实是不合理的。如果遇到这种情况:AlertDialog里面有一个文本框,要求用户必须输入内容,但如果用户没有输入就点击了确定,这时对话框是不应该消失的,而是应该保留该对话框并提示用户必须输入文字。解决办法:final AlertDia

2016-04-13 17:35:38 15166 4

原创 用handler发延时消息时最好设置设为static

一旦用handler发出延时的message,message会被保存在消息队列中,这段延时的时间,message会保持对handler的引用,导致handler无法被回收,使用handler的activity和service也无法被回收,即使onDestroy()方法被调用。这种情况应该把handler类修饰为static,这样handler类就是activity的静态内部类,静态内部

2016-04-13 17:06:36 1400

原创 ListView的item实现滑动、点击、长按不冲突

要实现这样的一个功能:一个ListView,能向左滑动出现删除按钮,点击item进入详情,长按item进入编辑也就是说要做到滑动、点击、长按三个动作互不干扰,滑动时间长了不能触发长按,滑动后手松开不能触发点击。刚开始我用的方法是:item的view复写onTouchEvent   +  item setOnItemClickListener   +   item set

2016-03-23 19:47:22 4461 1

原创 UniversalImageLoader不能加载本地图片的解决方法

Universal-Image-Loader无法通过绝对路径直接加载SD卡中的图片,比如:String imagePath = "/storage/emulated/0/Pictures/Screenshots/pic.png"如果直接这么用会失败:ImageLoader.getInstance().displayImage(imagePath, imageView);

2016-03-20 20:02:48 2456

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除