Android程式設計容易犯的錯誤之二

夢書發表於2013-10-16

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)

 

 

 

 

 

 

 

 

相關文章