梦书之家(移动开发)

你有一个苹果,我有一个苹果,我们交换一下,一人还是一个苹果;你有一个思想,我有一个思想,我们交换一下,一人就有两个思想。 ——肖伯纳

导航

Android编程容易犯的错误之二

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

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

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

            Calendar calendar = Calendar.getInstance();
            if(!TextUtils.isEmpty(dateTimes)){
                long milliseconds = WLDateUtils.parseDayTime(dateTimes);
                calendar.setTimeInMillis(milliseconds);
            }
            final int old_year = calendar.get(Calendar.YEAR);
            final int old_month = calendar.get(Calendar.MONTH);
            final int old_day = calendar.get(Calendar.DAY_OF_MONTH);
            mDatePickerDialog = new DatePickerDialog(this, new OnDateSetListener(){
                @Override
                public void onDateSet(DatePicker view, int year,
                        int monthOfYear, int dayOfMonth) {
                    if(year != old_year || monthOfYear != old_month || dayOfMonth != old_day){
                        String dateTimes = String.format("%04d-%02d-%02d", year,
                                monthOfYear + 1, dayOfMonth);//月份是从0开始的
                    }
                }
            }, 
            old_year, old_month, old_day);
13.设置ListView的分割线,如果不是图片的话,应注意顺序:
        mListView = new ListView(this);
        mListView.setCacheColorHint(0);
        mListView.setBackgroundDrawable(null);
        mListView.setDivider(getResources().getDrawable(R.drawable.list_divider));
        mListView.setDividerHeight(2);

其中:
<drawable name="list_divider">#00CCCC00</drawable>

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

14.拼写错误

1)

<uses-permission android:name="android.permission.BLUETOOTH" />

而不是

<user-permission android:name="android.permission.BLUETOOTH" />

而且就算这样写错了,也能编译通过,只不过安装的时候不会显示该APP需要的权限,当然该APP什么权限都没有申请到。

15.当遇到如下的错误的时候(但是直接在PC的浏览器输入地址是没有问题的),第一个感觉是去验证下设备(比如手机是否能联网) ,而不是去找服务器端开发人员,质疑网络配置是不是有问题:

10-15 17:03:36.043: E/XXXApp(5660): Connection I/O Exception :java.net.UnknownHostException: Unable to resolve host "www.baidu.com": No address associated with hostname

16.TextView千万不要被放大,也不要作为将要被放大的父视图中,否则TextView上的文字四周会出现像毛笔字旁边的方框,尤其是大屏幕的设备(比如:电视)很容易看到。

17.selector(XML资源定义)中千万不要将@null给drawable否则,XML inflate时,会报

android.view.InflateException: Binary XML file ...

的错误。解决方法是:采用透明图代替这个@null

18. 对于像ListView、GridView的上下边距,如果怎么设置都达不到效果的时候,可以看看这个clipToPadding的这个属性,其值默认为false的,保证你看完有相见恨晚的感觉。

19.Java的标准代码,也有违反常理的例子,比如Calendar.getInstance(),看这名字,以为是单实例,可看了源代码,就会发现,其实就是一个静态的函数,用于创建Calendar对象

    public static synchronized Calendar getInstance() {
        return new GregorianCalendar();
    }

    public GregorianCalendar() {
        this(TimeZone.getDefault(), Locale.getDefault());
    }

    public GregorianCalendar(TimeZone timezone, Locale locale) {
        super(timezone, locale);
        setTimeInMillis(System.currentTimeMillis());
    }

 20.对于有时偶尔遇到的问题,应该考虑下是否是多线程引起的问题,多打LOG,对于可能引起问题的地方,加个同步所看看。

21.使用ViewStub时遇到如下的FC log

E/AndroidRuntime(4441): java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent
E/AndroidRuntime(4441):     at android.view.ViewStub.inflate(ViewStub.java:287)

Java代码

                mAttachViewStub.setVisibility(View.VISIBLE);
                View view = mAttachViewStub.inflate();
                mScreenView = (ScreenView)view.findViewById(
                        R.id.attachment_type_screen);

排查才知道,其实mAttachViewStub.setVisibility(View.VISIBLE)相当于mAttachViewStub.inflate(),所以以上的代码相当于重复inflate了ViewStub,导致FC。

以上选择其中一个即可,当然用直接调用的话比较好,查找效率高:

 

View view = mAttachViewStub.inflate();
mScreenView = (ScreenView)view.findViewById(R.id.attachment_type_screens);

 

而如下的方法,效率明显低些,尤其整个页面的View比较多的时候,因为需要在整个页面查找View:

mAttachViewStub.setVisibility(View.VISIBLE);
mScreenView = (ScreenView)findViewById(R.id.attachment_type_screens);

 22. 千万不要将原本是JPG格式图片文件的扩展名标记为PNG,这样平常用Eclipse开发的时候没有报错,但是一旦用源码编译就会出现问题:

libpng error: Not a PNG file
ERROR: Failure processing PNG image packages/apps/Contact/res/drawable-xxhdpi/title.png

竟而导致以后一堆的:

packages/apps/Contact/res/layout/detail_box.xml:89: error: Error: No resource found that matches the given name (at 'background' with value '@drawable/add_pic_btn_bg').

当然也不要将PNG图片文件的扩展名标记为JPG。

 23.注意id不要写重了,尤其是有用include layout 或者字节写的控件布局的,通过findViewById找到的是第一个匹配的id;

这个查起来就很麻烦。(20161229)

 

 

 

 

 

 

 

 


posted on 2013-10-16 15:00  梦书  阅读(5204)  评论(0编辑  收藏  举报