踩坑记录3

36 篇文章 0 订阅
29 篇文章 0 订阅
43、减少方法数:避免在内部类中访问外部类的私有方法/变量;避免调用派生类中的未被覆盖(override)的方法
44、Java8 的新并发特性1. LongAdder DoubleAdder 2. CompletableFuture 3. StampedLock 4.ForkJoinPool中增加新方法、
45、Arrays.parallelSort java8新增的并行排序算法,基于fork/join框架。可以看出当数据规模达到262144(即2的18次方)时,并行排序的性能要超过串行排序
46、ForkJoin其核心思想就是分治。Fork分解任务,Join收集数据。ForkJoin主要提供了两个主要的执行任务的接口。RecurisiveAction与RecurisiveTas。ForkJoinTask在执行的时候可能会抛出异常,但是没办法在主线程里直接捕获异常,所以ForkJoinTask提供了isCompletedAbnormally()方法来检查任务是否已经抛出异常或已经被取消了,并且可以通过ForkJoinTask的getException方法获取异常
47、认真对待Executor和CompletionService
48、andorid 多进程会生成不同的Application
49、#查看apk的method总数dexdump -f app.apk | grep method_ids_size
50、#查看apk的field总数dexdump -f app.apk | grep field_ids_size
51、使 SugarORM 框架的坑用属性名所采用驼峰命名法,那么大写的字母会在创建的表中字段转换成下划线。如果你用sql语句,表名要写正确了,不要忘了加下划线。同理,表的字段也是一样。
52、GreenDao是一个很快的解决方案,它能够支持数千条记录的CRUD每秒,和OrmLite相比,GreenDAO要快几乎4.5倍。(准确数据请自行benchmark)。GreenDAO小于100KB,所以对于应用程序APK的大小影响很小
53、 DrawableCompat使用:一张图片实现selector效果
54、垂直布局时要考虑导航栏(navigationbar)的影响,导航栏会占据位置
55、 使用Serializable和parcel传输相同对象,都转换为byte[]后,parcel大概是serializable的20倍了。但是官方建议使用Parcel,原因是说速度是serializable的将近10倍。
56、Bundle缓冲区最大1MB,并且这是该进程中所有正在进行中的传输对象所公用的。具体某一次Activity间传输的限制大小是不确定的,依据使用环境而定。
57、activtiy 主动调用finish不会执行onSaveInstanceState
56、HandlerThread适合在只需要在一个工作线程(非UI线程)+任务的等待队列的形式,优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理。处理效率较低
57、PWA 其实是在普通的移动 Web App 上加持很多新的 Web 技术以期望达到 Native App 的体验
58、Sync:继承于经典的AbstractQueuedSynchronizer(传说中的AQS),是一个抽象类,包含2个抽象方法readerShouldBlock();writerShouldBlock()
59、FairSync和NonfairSync:继承于Sync,分别实现了公平/非公平锁。
60、ReadLock和WriteLock:都是Lock实现类,分别实现了读、写锁。ReadLock是共享的,而WriteLock是独占的。于是Sync类覆盖了AQS中独占和共享模式的抽象方法(tryAcquire/tryAcquireShared等),用同一个等待队列来维护读/写排队线程,而用一个32位int state标示和记录读/写锁重入次数--Doug Lea把状态的高16位用作读锁,记录所有读锁重入次数之和,低16位用作写锁,记录写锁重入次数。所以无论是读锁还是写锁最多只能被持有65535次。
61、实现圆形图片采用图片渲染器 BitmapShader 或 PorterDuffXfermode(Xfermode子类有3个其他两个已弃用)
62、如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
63、因so文件目录引起的UnsatisfiedLinkError: … :findLibrary returned null问题。Android开发中,不可避免的可能会引用到外部so文件,设置一个项目中可能需要引用多个不同的外部so文件。因为不同的引入库中so文件的目录可能不同,导致打包后生成的项目lib目录中的目录结构是不同的外部so文件目录的合集。可能会出现armabi/armeabi-v7a/x86/mips等,一般情况下,armabi应该是有的,当此三个目录下的文件可能不同时,在某些特定机型下很可能会出现如上错误。原因在于不同的机型CPU结构不同导致搜寻不同的目录下面的包,而由于外部库不同的so文件目录可能armabi下还有a、b so文件,而x86下可能只含有a,此时解决方案如下:直接删除其他目录(如armabi-v7a/mips/x86等),只保持armabi目录即可,当不存在x86目录时,相应机型也自然会取armabi目录下搜寻相应so文件
64、从AndroidManifest.xml中获取channel出现错误提示:Key xx expected String but value was a java.lang.Integer.  The default value <null> was reurned。
对于AndroidManifest.xml配置channel名称时,当直接使用数字字符串时,会出现如上所示,获取到的channel值为null。
65、元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
@Target,@Retention,@Documented,@Inherited
66、在 release 混淆过程中删除 Log 代码,使用 -assumenosideeffects 这个配置项可以帮我们在编译成APK之把日志代码全部删掉,这么做不仅有助于提升性能,而且日志代码往往会保留很多我们的意图和许多可被反编译的字符串-assumenosideeffects class android.util.Log { 
    public static boolean isLoggable(java.lang.String, int); 
    public static int d(...); 
    public static int w(...); 
    public static int v(...); 
    public static int i(...); 

67、Fatal Exception: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@8086356 is not valid; is your activity running?
在系统或Service中创建对话框时,如果使用在Activity中创建对话框的方法,运行时必然导致错误。因为AlertDialog的显示需要依附于一个确定的Activity类,而系统和Service并不是一个Activity。这时具体的做法就是:写好Alter功能块后,在alter.show()语句前加入:alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alterDialog为AlertDialog类型对象,如果是在Service中使用,还需要在AndroidManifest.xml中加入权限:<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
68、在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环
69、Collections.synchronizedMap();处理HashMap成为SynchronizedMap;原理是在map的每个操作上加上synchronized,并且是锁定Map整个对象,效率不高,谨慎使用;synchronizedlist 和synchronizedset 原理类似
70、LocalBroadcastManager本地广播是无法通过静态注册来实现的。因为静态注册是为了让程序未启动也能接收广播。本地广播是在本程序内进行传递,肯定是已经启动了,因此也完全不需要静态注册
71、发送有序广播的方法不再是sendBroadcast(),而是sendOrderedBroadcast()方法,在onReceive()方法中调用abortBroadcast();就表示将该广播截断,其他的接收器就无法再接收到此广播了
72、 本地进程间通讯:LocalSocket客户端使用,创建套接字LocalServerSocket服务端使用,创建套接字同时指定文件描述符
73、Android中Service向Activity传值有四种,分别是 用广播、Service回调+自定义binder、aidl、LocalSocket
74、在Java 7中,我们可以用一个catch块捕获所有这些异常:catch(IOException | SQLException | Exception ex)
75、Android 的localSocket是 UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。是全双工的,API接口语义丰富,相比其它IPC机制有明显的优越性
76、onNewIntent在不同的launchMode情况下要考虑
77、OnkeyDown事件 和OnkeyUp事件是不同事件。 OnBackPressed方法会处理返回键的操作,不会向上传播,如果你想向上传播 请使用OnkeyDown事件或OnkeyUp事件,在重写onBackPressed时要将super.onBackPressed()去掉或写在你的功能代码之后
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值