简介
当程序崩溃(Crash)的时候,默认是不对异常信息做处理的。如果想要把异常信息保存到本地文件中,或上传的服务器。那么就要借助UncaughtExceptionHandler
这个类。
在手机客户端尤其是Android应用的开发过程中,我们经常会接触到“硬件加速”这个词。由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,因此常会有一些误解,如硬件加速是不是通过特殊算法实现页面渲染加速,或是通过硬件提高CPU/GPU运算速率实现渲染加速。
本文尝试从底层硬件原理,一直到上层代码实现,对硬件加速技术进行简单介绍,其中上层实现基于Android 6.0。
项目中有个Module需要解析json所以选用了依赖Gson,但是编译时报错如下:
1 | Error:Execution failed for task ':app:transformClassesWithJarMergingForAutoioDebug'. |
看到错误中的这个duplicate,第一反应和平常一样,难道是得先清理一下Clean project ? 反复试了几次都不行,上网查才发现是重复依赖Gson库的问题,导致项目中有了两个重复的Expose.class
类。
使用快捷键(Shift + Ctrl + T)查看项目中的Expose.class
类,发现是和passport-1.4.2.jar这个本地jar包冲突了,它也依赖了gson库所以导致了重复依赖。
本文来源:QQ空间终端开发团队公众号
对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针;
对于Java来说,就是new出来的Object 放在Heap上无法被GC回收;
本文通过QQ和Qzone中内存泄漏实例来讲android中内存泄漏分析解法和编写代码应注意的事项。
静态储存区:编译时就分配好,在程序整个运行期间都存在。它主要存放静态数据和常量;
栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存;
堆区:通常存放 new 出来的对象。由 Java 垃圾回收器回收。
AlertDialog中加入EditText但是不弹出软键盘等问题网上有很多不管用的解决方案,有的方案是强制弹出软键盘,然而即使弹出来,也是显示在AlertDialog的后面,被Dialog遮挡。
Dialog的官方文档:http://developer.android.com/reference/android/app/Dialog.html ,其中有一段:
Note: Activities provide a facility to manage the creation, saving and restoring of dialogs. See onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), and dismissDialog(int). If these methods are used, getOwnerActivity() will return the Activity that managed this dialog.
在客户端开发中,我们往往需要对一个TextView的文字的部分内容进行特殊化处理,比如加粗、改变颜色、加链接、下划线等。iOS为我们提供了AttributedString
,而Android则提供了SpannableString
。
在Android的android.text.style包下为我们提供了各种各样的span(可以参考这篇文章),例如:
AbsoluteSizeSpan(int size) —— 设置字体大小,参数是绝对数值,相当于Word中的字体大小
RelativeSizeSpan(float proportion) —— 设置字体大小,参数是相对于默认字体大小的倍数,比如默认字体大小是x, 那么设置后的字体大小就是x*proportion,这个用起来比较灵活,proportion>1就是放大(zoom in), proportion<1就是缩小(zoom out)
BackgroundColorSpan(int color) —— 背景着色,参数是颜色数值,可以直接使用android.graphics.Color里面定义的常量,或是用Color.rgb(int, int, int)
ForegroundColorSpan(int color) —— 前景着色,也就是字的着色,参数与背景着色一致
<? extends T>
和<? super T>
是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。
<? extends T>
:是指 “上界通配符(Upper Bounds Wildcards)”<? super T>
:是指 “下界通配符(Lower Bounds Wildcards)”使用泛型的过程中,经常出现一种很别扭的情况。比如按照题主的例子,我们有Fruit类,和它的派生类Apple类。
1 | class Fruit {} |
然后有一个最简单的容器:Plate类。盘子里可以放一个泛型的“东西”。我们可以对这个东西做最简单的“放”和“取”的动作:set( )
和get( )
方法。
1 | class Plate<T>{ |
首先,我们看下下面这段简短的代码:
1 | public class GenericTest { |
定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似于//①
中的错误。因为编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。
在如上的编码过程中,我们发现主要存在两个问题:
当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,改对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。
因此,//① 处取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。
那么有没有什么办法可以使集合能够记住集合内元素各类型,且能够达到只要编译时不出现问题,运行时就不会出现“java.lang.ClassCastException”异常呢?答案就是使用泛型。
Probability is nothing but common sense reduced to calculation.(概率论只不过是把常识用数学公式表达了出来。)
—— Pierre-Simon Laplace
记得读本科的时候,最喜欢到城里的计算机书店里面去闲逛,一逛就是好几个小时;有一次,在书店看到一本书,名叫贝叶斯方法。当时数学系的课程还没有学到概率统计。我心想,一个方法能够专门写出一本书来,肯定很牛逼。后来,我发现当初的那个朴素归纳推理成立了 —— 这果然是个牛逼的方法。
——题记
这是一篇关于贝叶斯方法的科普文,我会尽量少用公式,多用平白的语言叙述,多举实际例子。更严格的公式和计算我会在相应的地方注明参考资料。贝叶斯方法被证明是非常 general 且强大的推理框架,文中你会看到很多有趣的应用。