那些曾经踩过的坑

1、很多时候我们会对一个EditText内容,点击回车键时进行响应,此时设置

      inputView.setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                searchFriend();
                return true;
            }
        });
  但是需要注意的是,点击回车键时这个onEditorAction会走两次,第一次event为空,第二次不为空,若回车键时要请求网络,这里就会请求
  两次网络,浪费掉一次,此时需要做特殊处理,要么自己用变量标识是否第一次,要么当event为空时直接返回false。

2、当发现某个操作使activity的启动速度变慢,此时不妨用postDelay 方法使这个操作延后处理,postDelay 是一个很好用的方法,百试百灵。
3、给listview 添加头部,把头部隐藏后,头部所占据的位置还在,只是看不见了,只能通过removeHead来消除这个位置。
4、部分机型的webview 有问题,可能是因为 WebViewClient 的 onReceivedSslError 方法有误(证书问题),若直接调用super.onReceivedSslError ,由于父类直接调用handler.cancel();导致异常,我们在改方法内部重写为 handler.proceed();
5、若要在 viewstub的 onInflate 方法中对某个view 设置点击事件,需要注意,否则有可能下一次的点击事件会沿用上一次的信息。
6、对于for 循环,想要退出某次循环时,想想用break 还是 continue,但一定不要用return, 这是个很不好的习惯。
7、在线程里面的变量要注意与外面变量的一致性,否则就重新声明,不然容易出现并发修改错误concurrentModificationException.有时候for循环使用不当也会报这个错误。
8、 A.addAll (B), A不能为空,B可以为空。
9、注册一定要和解注册配对使用,要不然容易造成内存泄露且容易出错。

10、当一种解决方案你觉得很复杂,那么你应该想这一定不是最好的方法,肯定还有更好的解决方案。
比如你想在 View 销毁的时候为他解注册,那么一定要加个destroy的方法,让后在每个activity销毁的时候调用 View 的destroy方法吗,
肯定不是,这样太麻烦了,此时你应该换一种思路,而此时刚好View 为你提供了onDetachedFromWindow 方法,让你去重载。
11、当调用RequestLayout 而 OnDraw方法不走,可能是setWillNotDraw( false ) 或者参考TextView源码,在 RequestLayout 后调用 invalidate
12、Fragment 的 onActivityResult 方法不走的解决办法: 在Fragment 的 onActivityResult 方法中去掉super.onActivityResult,
在Fragment 所依附的 activity 的 onActivityResult 中 调用super.onActivityResult,并手动调用 Fragment 的 onActivityResult方法。
13、在通知栏发通知,nm.notify(notifyId, notiBuilder.build()); notifyId 相同则合并到一条通知,否则不合并。
PendingIntent.getBroadcast(context, id, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
若id相同,则后面的intent会覆盖前一个intent,在通知栏有两个通知,可能点击后会有问题,此时只能用不同的id来解决问题,改变
PendingIntent.FLAG_UPDATE_CURRENT这个值也是解决不了问题的。

14、觉得很奇怪、没法解决的bug,但又可能是系统的,我们可以参照其他应用是否有相同问题,比如短信、联系人,若有相同问题则不作处理。
15、在findViewById找不到id,采用clean或者直接在错误中delete,要不然就是在import中import错误,看自己是不是import android.R,应该是import 自己包中的R。

16、无法获取焦点或者弹不出软键盘:this.setFocusable(true);
 this.setFocusableInTouchMode(true);
manifest文件中给Activity配置android:windowSoftInputMode=”stateVisible|adjustPan”
stateVisible 与 stateAlwaysVisible的区别:前者在进入时弹出软键盘,后者一直都在,跳到其他页面按返回键它也弹出。
adjustPan则让键盘一开始就弹出来并适应屏幕大小。

17、避免的内存泄露的细节:
a、资源对象要关闭,比如数据库操作中的Cursor,IO操作的对象。流的关闭在finally中进行,实现非空判断,先new的最后释放,而且cursor一定要关闭。
b、注册与解注册对应起来。
c、Context变量不要声明为静态变量,且在单例类中使用到了context变量需要注意,防止它一直被引用。

18、TextUtils.isEmpty() 把这个变量作为参数传进去。只要这个参数为空或者为“”,都会返回真
19、String text; Html.fromHtml(text).toString(); 将网络上的text 除去转义字符什么的,但可能会有异常,最好try catch一下。
20、当重写onDraw方法时,在构造函数加一上句:setWillNotDraw(false); 以防止onDraw函数不被调用。
21、由PopupWindow引起的崩溃可能是context获取错误,要用activity层级而不是application层级的context,也有可能是TabActivity引起的错误,还有可能是要由点击事件才能引发其showAtLocation动作,此时用任何一个View的postDelayed方法来延缓其showAtLocation操作。
ListPopupWindow虽然好用,但也有局限性,它不能设置附在View的上方还是下方,会判断上方还是下方的空间大,然后决定弹出位置。

22、StringBuffer线程安全,StringBuilder是非线程安全。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值