Android開發問題集錦

quentain發表於2015-09-15

轉載自這個文章:點選開啟連結

問題一:Android Zip解壓縮類處理中文名亂碼
答:目前Android平臺上的底層庫仍然有很多不完善的地方比如zlib庫處理Zip檔案時無法對中文檔名做正確的處理,同時無法類似J2SE那樣 的android.util.zip類沒有setEncoding方法處理。目前解決方法是引入apache的ant庫來實現解壓縮,同時apache ant庫好包含了完整的xml dom4j解析庫可以實現document的儲存。
當然引入apache ant庫的問題是造成程式編譯後體積變得臃腫,演算法因為是java寫的效率上會大打折扣,但是解決下問題還是可以的,重量級處理還是放到伺服器上比較好。
目前總體來看Android平臺底層庫很多地方做的不近人如意,很多關鍵地方都出現了問題。
問題二:layout_weight的作用是什麼?
答:很多時候大家可能發現佈局xml檔案中有一個layout_weight屬性,不是layout_height也不是layout_width,那麼 layout_weight是什麼呢? 它的定義是一個比重。比如在一個LinearLayout中,有三個TextView控制元件,如果第一個設定layout_height為1,第二個為1,最後一個為2,這時候這三個TextView控制元件的大小為 1:1:2 。在Android開發中我們可能經常用到這個屬性來排列一些控制元件。
問題三:No marked region found along edge錯誤
答:如果在Android專案中使用Nine Patch資源,時候可能出現比如ERROR: 9-patch image eoeAndroid .9.png malformed.或 No marked region found along edge.以及 Found along top edge.的錯誤主要是因為該圖片沒有四周的定位畫素。
問題四:ListView在ScrollView中無法正常顯示
答:對於ListView放在在ScrollView中時,目前Android平臺仍然有些bug,狀態是顯示的ListView僅僅大約一行半(總Item 肯定大於2行,比如10行),通過Layout佈局屬性設定目前仍然無法修正。通過分析ListView和ScrollView構造沒有發現很好的解決方法,目前可以通過自己實現ListView來解決,Tony解決的方式是重寫ListView的onMeasure重新計算顯示行數。希望在 Android以後的版本,至少2.1以後能夠改進。
問題五:Android方法中的synchronized是什麼意思?
答: 很多朋友可能看到部分Android方法中出現了synchronized字樣,比如public static synchronized String getHttpResponse(String url) ,其實這個問題屬於Java基礎和Android無關,使用關鍵字 synchronized 字面表示同步,而實際中在多執行緒程式裡
為了防止結果出現意外(會出什麼意外呢?Tony舉例比如一個執行緒正在寫檔案,還沒有寫完,但是另一個執行緒就開始讀取了),加入synchronized可以為該方法上鎖,即只有一個執行緒單獨訪問該方法,類似Win32中的臨界區Critical Section是一個道理。不過要提示大家該方法不要濫用,線上程安全的場合下使用會增加系統開銷影響效能。而有些時候還會在方法中出現 synchronized(this) 字樣,不錯 synchronized(this) 一般用於鎖住某個迴圈中的內容,在iPhone Cocoa中也同樣適用。
問題六:layout_toRight錯誤解決方法
答:有朋友詢問在匯入一些老版本的Android專案時出現了layout_toRight 的錯誤提示,具體的如No resource identifier found for attribute 'layout_toRight' in package 'android',其實在Android 1.1開始SDK做了小幅的改變,比如android:id均換為android:name,這裡layout_toRight換成 layout_toRightOf即可。有些情況ADT還可能幫助我們修正問題,Tony提示直接在錯誤的地方單擊滑鼠右鍵,選擇Quick Fix不妨看看。
問題七:Resource is out of sync with錯誤
答:很多網友抱怨Android的Eclipse很差勁,經常出現一堆莫名其妙的錯誤,Resource is out of sync with the file system錯誤如何解決呢? 這主要是由於資原始檔被Eclipse之外的編輯器開啟了,為了保證剛才儲存的東西不受衝突,IDE自己保護了,解決的方法最笨的就是關掉Eclipse 再開,提示資源儲存時單擊No,或者直接按F5鍵,如果程式時自動編譯的清空下專案會重新生成。的確從多年前的Symbian時代開始Carbide C++(基於Eclipse)就從來沒有給開發者帶來過效率,相比開發iPhone的xCode或者Windows Mobile的Visual Studio來說Eclipse這個Java開發的東西實在不敢恭維啊,假死和糟糕的使用者體驗實在讓人難忘。
問題八:Adapter中notifyDataSetChanged的作用
答:對於Android開發來說處理一些介面需要和Adapter介面卡打交道,雖然Android自帶了一些比如ArrayAdapter但是大多數情況下無法滿足我們需要,所以就要從BaseAdapter派生一個類滿足我們特殊的需要。
首先我們可能重寫getView(),通過LayoutInflater的inflate方法對映一個自己定義的Layout佈局xml載入或從xxxView中建立。這些大家可能滾瓜爛熟了但是仍然很多Android開發者對於BaseAdapter中notifyDataSetChanged()方法不是很理解,notifyDataSetChanged方法通過一個外部的方法控制如果介面卡的內容改變時需要強制呼叫getView來重新整理每個Item的內容。
問題九:The content of the adapter has changed解決方法
答:很多新手在Android開發時可能對Thread和Message以及Handler、Looper概念不是很清楚,可能產生類似 The content of the adapter has changed but ListView did not receive a notification make sure the content of your adapter is not modified from a background thread . but only from the UI thread.的錯誤。來自郵箱中這個問題,解決方法必須要詳細的程式碼,不過給出以下幾點可以幫助你瞭解該問題:
1.改變介面卡Adapter內容時不要在後臺執行緒中,必須在UI執行緒中處理,這點可以通過Handler傳出來解決。
2.嘗試Adapter的notifyDataSetChanged()方法,當然主要看你程式碼的具體情況。
問題十: APK檔案為什麼要簽名才能釋出?
很多開發人員不明白APK檔案為什麼必須簽名才能釋出,其實簽名並非從Android平臺開始,在過去從Symbian OS就開始需要簽名才能釋出,這樣可以保證每個應用程式開發商合法ID,由於Android平臺沒有UID3的限制,部分開放商可能通過使用相同的 Package Name來混淆替換已經安裝的程式。不過目前比較好的是Android中所有的permission使用都是免費的,但從目前GIT專案中出現的 CertInstaller.git包不知道是不是和證照有關,而近幾年Symbian OS從v9.0開始如果應用程式涉及敏感操作需要Capability才能使其真機順利安裝,同時部分高階許可權需要購買和Symbian Signed測試才能釋出,保證系統的安全可靠性,而這點Android平臺較為寬鬆。常規情況下從ADB比如Eclipse的ADT外掛安裝到模擬器或真機的測試程式經過DEBUG標記簽名,所以我們簽名是都需要先建立key公鑰通過RSA運算才實現加密。


相關文章