android开发常见编程错误总结

泡在网上的日子 / 文 发表于2013-09-07 13:07  第771次阅读 android,异常

编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!

1.设置TextView的文本颜色

  1. TextView tv;
  2. ...
  3. tv.setTextColor(R.color.white);

其实这样设置的颜色是 R.color.white的资源ID值所代表的颜色值,而不是资源color下的white颜色值:正确的做法如下:

  1. tv.setTextColor(getResources().getColor(R.color.white));

这个出错的概率满高的,就是因为二者都是int类,导致编译器不报错。

2.读取Cursor中的值

  1. Uri uri;
  2. Cursor cursor = contentResolver.query(uri, null,null,null,null);
  3. if(cursor !=null){
  4. String name = cursor.getString(1);//
  5. curosr.close();
  6. cursor =null;
  7. }

上面语句中的,执行到cursor.getString(1)部分就会报异常,异常是: Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 4

编译没有问题,只有在运行的时候才会发现。

正确的做法是:

  1. Uri uri;
  2. Cursor cursor = contentResolver.query(uri, null,null,null,null);
  3. if(cursor !=null){
  4. if(cursor.moveToFirst()){
  5. String name = cursor.getString(1);//
  6. }
  7. curosr.close();
  8. cursor =null;
  9. }

或者:

  1. Uri uri;
  2. Cursor cursor = contentResolver.query(uri, null,null,null,null);
  3. if(cursor !=null){
  4. while(cursor.moveToNext()){
  5. String name = cursor.getString(1);//
  6. }
  7. curosr.close();
  8. cursor =null;
  9. }

3.不要使用标有Deprecated的函数或者类,比如不要使用android.telephony.gsm.SmsMessage,而应该用android.telephony.SmsMessage,这样避免采用不同的3G协议时不会出现问题。

4.SQLite中的查询条件,比如一个叫name的字段,其字段类型为TEXT,如果我们要判断其name不等某个值(如zhangsan),写出如下的语句

  1. name <> 'zhangsan'

但是,这样写的语句,如果碰到name值为空的时候,就有问题,即name为空时 以上的布尔值为false,而不是true.

原因很可能,SQLite中的判断函数采用类似写法:

  1. boolean judge(String self, String conditions){
  2. if(null == self) return false;
  3. return self.equalsIgnoreCase(conditions);
  4. }

其中 self为数据库中name的值,而conditions为上面示例中的 zhangsan。

所以,以上查询条件的正确写法是:

  1. name <> 'zhangsan' or name is null

除非你也想过滤掉name 为空的记录。

5.如下所示,想要在按钮显示"删 除"(没错删除中间有个空格),以下的字符串资源是错误的:

  1. <string name="button_delete_text">删 除</string>

这样的出来,最终看不到中间的空格,应该是Android SDK编译的时候,会自动过滤掉String中的空格部分,所以应该采用以下的方式:

  1. <string name="button_delete_text">删\u0020除</string>

类似地,其他的特殊符号都可以用\u00XX来转义,如 ' ---- \u0027,  < ----- \u003C, > ---- \u003E 。

注意这里的数字是16进制哦。

还有一种方法是:这个应该是XML经常使用的方法(new 2013.03.28)

'

<

>

别忘了数字后面的分号哦,而且其中的数字是十进制的

6. context的问题:

如果在一个非Activity的context里面调用startActivity,那么其intent必须设置:

  1. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

否则,会报如下类似的错误:

  1. Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.

而我们还要提防系统控件中的隐性调用startActivity:

  1. TextView tv = new TextView(mContext);
  2. tv.setAutoLinkMask(Linkify.ALL);
  3. <br>tv.setText(content);

当content内容中有电话号码/邮件/URL时,并且mContext不是非Acitvity的context,而是app的context时(XXXActivity.this.getApplicationContext()),

就会出现如下的错误:

  1. android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity
  2. context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
  3. E/AndroidRuntime(10382): at android.app.ContextImpl.startActivity(ContextImpl.java:622)
  4. E/AndroidRuntime(10382): at android.content.ContextWrapper.startActivity(ContextWrapper.java:258)
  5. E/AndroidRuntime(10382): at android.text.style.URLSpan.onClick(URLSpan.java:62)

由于URLSpan.onClick中调用startActivity是由系统控制的,所以我们必须传入activity的contex,才不会出现如上的异常,导致程序退出。

7. 另外一个context的问题:如果你在一个单实例的对象中,有个注册监听器的行为的话,那么传给这个单实例

对象的context,就必须是ApplicationContext了,否则会出现:receiver leak的错误。

8. 控件有时不能充满整个屏幕:

  1. LinearLayout panel = new LinearLayout(this);
  2. LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
  3. LinearLayout.LayoutParams.FILL_PARENT,
  4. LinearLayout.LayoutParams.FILL_PARENT);
  5. panel.setLayoutParams(llp);
  6. root.addView(panel);

而应该是:

  1. LinearLayout panel = new LinearLayout(this);
  2. LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
  3. LinearLayout.LayoutParams.FILL_PARENT,
  4. LinearLayout.LayoutParams.FILL_PARENT);
  5. root.addView(panel. llp);

9.按照以下的方式启动service,但是service没有起来

  1. Intent service = new Intent(this, FuncService.class);
  2. startService(service);

很有可能是忘了在AndroidManifest.xml中注册FuncService

  1. <service android:name="com.android.example.FuncService"/>

10.TextView中为什么会在有些行尾出现"..."字符,当然不是所有手机都是有问题,本来笔者刚开始也以为可能是

手机的ROM问题,认真review了代码,发现如下的代码:

  1. mIntroView = (TextView) findViewById(R.id.description);
  2. mIntroView.setEllipsize(TruncateAt.END);

问题是上面的第2行,之前是因为要限定文本的行数,后来去掉限制,没有去掉以上的代码。

该行代码会导致很多的ROM上:只要一个文本行的文字在一个手机屏幕行显示不下的话,就自动在

行尾截断并在行尾添加"...",而之前没有问题是因为:全部显示的时候,我调用了如下方法:

  1. mIntro.setMaxLines(Integer.MAX_VALUE);

11.不要太相信工具,比如Eclipse里面的断点遇到多线程什么,经常不起作用/走不到,还有就是如果语句为空的也不会走,这时候别太早下结论断点地方出错了,

所以每个工程都应该有日志的开关,通过查看日志来确认,某个路径是否走到或者某个变量的值,。。。

12.Java中的月份是从0开始的,所以格式化月份的时候,记得在原有的值上加1处理,如

  1. Calendar calendar = Calendar.getInstance();
  2. if(!TextUtils.isEmpty(dateTimes)){
  3. long milliseconds = WLDateUtils.parseDayTime(dateTimes);
  4. calendar.setTimeInMillis(milliseconds);
  5. }
  6. final int old_year = calendar.get(Calendar.YEAR);
  7. final int old_month = calendar.get(Calendar.MONTH);
  8. final int old_day = calendar.get(Calendar.DAY_OF_MONTH);
  9. mDatePickerDialog = new DatePickerDialog(this, new OnDateSetListener(){
  10. @Override
  11. public void onDateSet(DatePicker view, int year,
  12. int monthOfYear, int dayOfMonth) {
  13. if(year != old_year || monthOfYear != old_month || dayOfMonth != old_day){
  14. String dateTimes = String.format("%04d-%02d-%02d", year,
  15. monthOfYear + 1, dayOfMonth);//月份是从0开始的
  16. }
  17. }
  18. },
  19. old_year, old_month, old_day);

13.设置ListView的分割线,如果不是图片的话,应注意顺序:

  1. mListView = new ListView(this);
  2. mListView.setCacheColorHint(0);
  3. mListView.setBackgroundDrawable(null);
  4. mListView.setDivider(getResources().getDrawable(R.drawable.list_divider));
  5. mListView.setDividerHeight(2);
  6. 其中:
  7. <drawable name="list_divider">#00CCCC00</drawable>

即 setDividerHeight 函数应该在setDivider之后,否则这个分割线无效。

他们收藏了这篇文章
相关文章
 
上一篇:activity外部调用startActivity的new task异常解析

我现在需要在点击listview的某个item的时候启动一个activity,因为我的listview不在activity中,所以为了简便我直接用context来调用activity,如下: Intent intent = new Intent(view.getContext(), BlogDetail.class);intent.putExtra("blog_id", blog.get
下一篇:安卓中webview与javascript的交互

当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释: A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some onlin

(转载)android开发常见编程错误总结的更多相关文章

  1. android开发常见编程错误总结

    1.设置TextView的文本颜色 1 2 3 TextView tv; ... tv.setTextColor(R.color.white); 其实这样设置的颜色是 R.color.white的资源 ...

  2. Android开发常见错误类型一览表

    这是我的第一个博客,我会一直添加我在Android开发中遇到的错误,用来记录我开发中踩过的那些坑 ------------------------分割线------------------------ ...

  3. Android开发常见错误汇总

    [错误信息] [2011-01-19 16:39:10 - ApiDemos] WARNING: Application does not specify an API level requireme ...

  4. Android开发 |常见的内存泄漏问题及解决办法

    在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要 ...

  5. Android开发——常见的内存泄漏以及解决方案(二)

    )Android2.3以后,SoftReference不再可靠.垃圾回收期更容易回收它,不再是内存不足时才回收软引用.那么缓存机制便失去了意义.Google官方建议使用LruCache作为缓存的集合类 ...

  6. Android开发——常见的内存泄漏以及解决方案(一)

    0. 前言   转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52333954 Android的内存泄漏是Android开发领域永恒的 ...

  7. Android开发常见的Activity中内存泄漏及解决办法

    上一篇文章楼主提到由Context引发的内存泄漏,在这一篇文章里,我们来谈谈Android开发中常见的Activity内存泄漏及解决办法.本文将会以“为什么”“怎么解决”的方式来介绍这几种内存泄漏. ...

  8. [转载]Android开发必备的21个免费资源和工具

    转载自: http://blog.csdn.net/shimiso/article/details/6788375 Android移动开发平台现在不是一个“火”字能形容的,今年Android平台在市场 ...

  9. Android开发常见错误及技巧

    1.无法使用网络:Permission denied(maybe missing internet permission) 在AndroidMainifest.xml中增加允许使用网络选项(在< ...

随机推荐

  1. rabbitmq和kafka的区别

    1.吞吐量kafka吞吐量更高: 1)Zero Copy机制,内核copy数据直接copy到网络设备,不必经过内核到用户再到内核的copy,减小了copy次数和上下文切换次数,大大提高了效率. 2)磁 ...

  2. SUSE 11 SP3 搭建weblogic服务

    环境的搭建和业务需求相关,仅供参考 环境: SUSE 11 SP3 安装步骤 创建一个weblogic组 创建一个用户名为weblogic的用户, 创建相关目录 上传jdk,脚本等 安装 创建用户及其 ...

  3. PL\SQL(day05)

    PLSQL 1.常用的访问数据库的相关技术 1) plsql 过程化的sql 2) proc/c++ 在c/c++语言中访问oracle数据库的技术 3) ado/odbc vc中访问数据库的技术 4 ...

  4. nyoj23-取石子(一)

    取石子(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的 ...

  5. CSS学习笔记之框模型

    1.概述 为了更好的处理 元素内容.内边距.边框 和 外边距 之间的关系,CSS 定义了框模型如下: 内边距.边框 和 外边距 的默认值都是零,可以通过设置元素的 padding.border 和 m ...

  6. Pycharm中Git、Github的简单使用和配置

    Pycharm中Git.Github的使用 PyCharm本身自带了git,稍微配置一下就可以很好的在图形界面下进行Python项目的版本控制 配置Git 在配置前先新建一个项目,当然也可以打开已有的 ...

  7. Docker理解与使用(转)

    2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业. 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简单 ...

  8. (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...

  9. [bzoj3209]花神的数论题_数位dp

    花神的数论题 bzoj-3209 题目大意:sum(i)表示i的二进制表示中1的个数,求$\prod\limits_{i=1}^n sum(i)$ 注释:$1\le n\le 10^{15}$. 想法 ...

  10. eclipse快捷键深入理解

    1.Eclipse 中的重构功能使其成为了一个现代的 Java 集成开发环境 (IDE),而不再是一个普通的文本编辑器.使用重构,您可以轻松更改您的代码,而不必担心对别处造成破坏. 2.Eclipse ...