1. 程式人生 > >Android開發過程中可能遇到的問題

Android開發過程中可能遇到的問題

一、匯入專案時,提示 “invalid project description”

無效的專案描述,應該與ADT版本不同有關。

出錯背景:外來原始碼放在工作區,然後匯入Eclipse。

解決方法:外來原始碼先放在非工作區(如:桌面),然後匯入到Eclipse,匯入頁面勾上 “copy projects to into workspace” 複製一份到工作區。

二、開啟Eclipse,提示 “Failed to create the Javae Virtual Machine”

無法建立Java虛擬機器

出錯背景:系統還原後出現或者感覺莫名其妙出現。實際上應該是環境、配置等發生變化,如果出現這個問題,請回顧之前有做過什麼事情,比如安裝或者更新JDK,修改過環境變數等等。

解決方法:首先確定JDK已安裝,環境變數已配置(JAVA_HOME, Path等),修改後重啟系統,我就是這麼搞定的。

如果無上述問題,那隻能修改 eclipse.ini 檔案,請自行選擇一種或幾種進行嘗試。

  1. // 1. 直接刪掉虛擬機器位置項, -vm 選項
  2. // 2. 新增java虛擬機器具體位置,分成兩行,例如
  3. -vm  
  4. C:\Program Files\java\jdk1.6.0_29\bin\javaw.exe  
  5. // 3. 減少堆空間的最大值,一般是砍一半
  6. -Xmx1024m   
  7. -Xmx512m  
  8. -Xmx256m  
  9. // 4. 修改JDK版本號,對應你的版本
  10. -Dosgi.requiredJavaVersion=1.6

其它補充:

1、eclipse.ini 檔案位置

windows 位於 eclipse 程式安裝目錄的根目錄

mac os  eclipse安裝目錄/Eclipse.app/Contents/MacOS,呃,就是右鍵應用圖示,選“顯示包內容“,然後你懂的

2、如果修改後仍然報錯,請確保解決方法第2項寫在 -vmgrgs 之前,如果你有寫的話

3、其它eclipse.ini檔案相關資料可以參考這裡

三、The connection to adb is down, and a severe error has occured.

The connection to adb is down, and a severe error has occured.
You must restart adb and Eclipse.

windows環境下有此問題,原因是有其它adb程序在執行,eclipse無法啟動sdk的adb。 
一般類似360手機助手、qq手機助手、豌豆莢以及酷狗音樂等可以連線到手機的程式,都有可能開一個adb程序,名字一般叫xxxadb,就是這個搞鬼。

解決方法:
首先,開啟工作管理員,仔細找一下,幹掉這個多餘adb程序。為方便起見,最好設定手機助手這類程式不可開機啟動。
接著,開啟cmd命令視窗, 輸入“adb kill-server”, 然後輸入“adb start-server”, 重啟一下adb。
最後,重啟eclipse,搞定收工。

其它補充:
adb命令需要配置環境變數,如果不想配置,可以cd到adb.exe所在目錄,

或者在adb.exe目錄下,按 shift + 滑鼠右鍵,點“在此處開啟命令視窗”。

四、Failed to install *.apk on device 'emulator-5554': timeout

執行程式安裝時,提示模擬器超時

解決:Mac環境下,可以使用通過重啟 adb 重新建立連線,基本上幾秒就可以搞定。

windows環境下重啟adb無效,也可能是我等得不夠久。直接關閉模擬器,重新 launch。

模擬器超時時間預設為 5000ms,顯然有點短,我們可以手動改大些。

eclipse下,window >> preferences >> Android >> DDMS >> ADB connection time out (ms) 值修改加大

其它:重啟adb方法,除了上面 “三” 用的命令,還可以在 eclipse 的 Devices 頁面 Reset adb。

 

五、使用Eclipse 打包apk,提示 conversion to dalvik format failed with error 1
解決:

1. 打包前刪除bin目錄下檔案;

2. clear project;

3. 確保apk輸出目錄不帶中文字元。

六、Eclipse android sdk content loader 0

開啟eclipse 後一直顯示在載入SDK,卡住了,重啟無效

解決:

1. 開啟 .android 目錄,一般在C盤administrator使用者目錄下;

2. 刪除 cache 目錄下的所有檔案;

3. 刪除 ddms.cfg 檔案;

4. 重啟ecplise。

參看這裡

七、Gradle project refresh failed error:cause:peer not authenticated

匯入專案後報錯,專案使用的Gradle版本和Android studio使用的Gradle版本不一致導致

修改Build.gradle 為當前使用的版本

classpath 'com.android.tools.build:gradle:2.1.2'

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

異常彙總:

一、java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.xxx}: java.lang.NullPointerException

原因1:控制元件沒有初始化直接使用,比如沒有new例項,沒有 findViewById(R.id),一般錯誤日誌有提示哪個控制元件。

原因2:使用 requestWindowFeature() 方法,需要寫在 setContentView(layoutId) 方法之前。

二、android.os.NetworkOnMainThreadException

原因1:在主執行緒訪問網路。Android 4.0 之前可以在主執行緒訪問,4.0 以後不再支援。

解決方法1:在 onCreate() 中新增下面程式碼

  1. protectedvoid onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     // 新增下面程式碼
  4.     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
  5.             .detectDiskReads().detectDiskWrites().detectNetwork()  
  6.             .penaltyLog().build());  
  7.     StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
  8.             .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()  
  9.             .build());  
  10. }  

解決方法2:在子執行緒中訪問網路

三、java.util.IllegalFormatConversionException: %d can't format java.lang.String arguments

原因:提示寫得很清楚,String型別的資料不能用%d進行格式。

出錯背景:使用 String.format 時,引數與轉換字元對應出錯。

四、android.widget.AbsListView.obtainView(AbsListView.java:2265)

原因:adapter中的 getView 方法返回null。

解決:檢查是否直接寫成 “return null;" 或者程式碼邏輯異常導致返回null

五、java.lang.RuntimeException: An erroroccured while executing doInBackground()

日誌提示 doInBackground() 這個方法裡有錯誤。

原因1:doInBackground() 這個方法執行在工作執行緒中,不允許做UI顯示。檢查這個方法,如果有關UI的顯示操作,移到onPostExecute() 方法中完成。

出錯背景:使用 AsyncTask 做網路資料請求。

六、java.lang.IllegalArgumentException: The key must be an application-specific resource id.

出錯背景:使用 view.setTag(int key, Object tag) 時,寫成 view.setTag(11, “text”),  這裡這個Key應該是一個R.id才行

解決:在strings.xml 檔案中增加id

  1. <!-- tag id -->
  2. <itemtype="id"name="key_text"></item>
  3. <itemtype="id"name="key_list"></item>
使用時

view.setTag(R.id.key_text, "text");

七、java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams

使用背景: View.setLayoutParams(LayoutParams params); 動態修改view的寬高

日誌提示:RelativeLayout.LayoutParams 不能轉換為 LinearLayout.LayoutParams, 所以這裡應該改為LinearLayout 的LayoutParams

解決:使用 View.setLayoutParams(LayoutParams params) 時,view的父控制元件是什麼佈局,就應該使用什麼佈局的LayoutParams

其它:當同一頁面中有兩個不同的View使用不同的LayoutParams時,寫上LayoutParams的類名可以有效減少失誤

  1. // 寫法一, 當使用多個不同的LayoutParams時易出錯
  2. LayoutParams lpLayoutParams1 = new LayoutParams(100100);   
  3. // 寫法二,指明是什麼佈局下的LayoutParams, 避免失誤
  4. LinearLayout.LayoutParams lpLayoutParams2 = new LinearLayout.LayoutParams(100100);  

八、java.lang.IllegalStateException: Can't change tag of fragment *

出錯背景:使用viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentList));

使用ViewPager載入多個Fragment頁面,這裡要為每個Fragment建立一個例項,再載入到列表中

若重複載入可能出現此異常

九、java.lang.UnsupportedOperationException: Can't convert to dimension: type=0x1

出錯背景:做解析度適配後出現

原因:某個解析度下,找不到對應的 dimens 值,比如可能沒有適配到小解析度的手機

十、java.lang.NoSuchMethodError: android.widget.RelativeLayout.setBackground

使用 RelativeLayout.setBackground 時出現

檢視官方文件,setBackground 需要API 大於等於16,API小於16,可以使用 setBackgroundDrawable

  1. if (Build.VERSION.SDK_INT >= 16) {  
  2.     layout.setBackground(drawable);  
  3. else {  
  4.     layout.setBackgroundDrawable(drawable);  
  5. }  

十一、java.lang.NoSuchMethodError: android.app.Notification$Builder.build

同上,使用需要API 大於等於16,低於16 可以匯入android v4 支援包

android.support.v4.app.NotificationCompat.Builder

十二、java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.

ListView 當有設定 header時,注意要先 addHeaderView() ,然後再 setAdapter()

  1. myList.addHeaderView(header); // 先
  2. myList.setAdapter(dataAdapter);  // 後

十三、android xml 中的 java.lang.IndexOutOfBoundsException: 

如果是java程式碼報錯,則是陣列下標越界,一般容易解決。

偶然一次是 android xml 檔案報錯,比較特殊,經查,確認是點9圖片的問題

這裡的xml 檔案引用了一個不規範的點9圖片,替換圖片即可解決。

常見的不規範問題:

1、字尾名沒有 .9

2、四周的拉伸的標記有缺

十四、Installation error: INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

背景:使用Genymotion出現此問題

原因:Genymotion 移除了對ARM Library 的支援,而很多應用都會用到ARM

解決:

方法一:為Genymotion 安裝ARM Libr 支援,點這裡下載,或者這裡下載,直接將壓縮包拖到Genymotion模擬器即可安裝。

方法二:使用android studio 或者 Intellij IDEA 可以通過設定避免該問題,參看這裡。

Genymotion 也移除了對Google Play 的支援,要安裝Google play 

十五、Multiple annotations found at this line:
- error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" 
attribute?

在XML 檔案出現,使用多個轉換符時,需要標註是第幾個 參考這裡

例如:

  1. // 報錯  
  2. <stringname="test">%s 價格%.2f元</string>
  3. // 需修改為  
  4. <stringname="test">%1$s 價格%2$.2f元</string>
十六、ListView OnItemClickListener 事件不響應

A. 列表項點選事件不響應,如果程式碼正常,可能是 listView item layout  中含有button 或 radioButton 等控制元件。

button 等控制元件會優先獲取到 focus,影響到列表項點選響應

解決:

方法一:為 button等控制元件設定 focusable="false"

方法二:為 item layout 根佈局設定 descendantFocusability="blocksDescendants"

  1. // 設定在Button等能夠獲取focus的控制元件上  
  2. android:focusable="false"
  3. // 設定在item 根佈局中  
  4. android:descendantFocusability="blocksDescendants"

B. 相反,如果 listView item layout 沒有button等控制元件,檢測 item layout 是不是寫了

  1. android:clickable="true"
如果有寫,砍了它!哎,說多了都是淚......

十七、java.lang.ExceptionInInitializerError   ......

Caused by: java.lang.UnsatisfiedLinkError: Couldn't load lept: findLibrary returned null

引用缺失

原因:

1. libs 中的 jar 包缺失,如果資料夾名為 lib ,請改為 libs

2.  libs / armeabi 下 .so 檔案缺失

十八、shape stroke 設定虛線變實線問題

android 4.0 後有此問題,參看這裡

解決:關閉硬體加速

在使用虛線的控制元件設定 android:layerType="software" 即可

十九、android.util.AndroidRuntimeException: { what=11 when=-91ms } This message is already in use.

使用handler 傳送訊息時,需要使用新的Messsage

二十、android.view.InflateException: You must specifiy a layout in the include tag: <include layout="@layout/layoutID" />

使用自定義佈局時候,確保使用為 

  1. <includelayout="@layout/your_layout"/>

而不是
  1. <includeandroid:layout="@layout/your_layout"/>