安卓開發難點攻克記錄(持續更新)


1、修改密碼界面自定義鍵盤刪除鍵顯示異常

現象描述:兩個頁面加載的同一個鍵盤布局,但是顯示時卻存在差異

其他界面鍵盤正常顯示
刪除鍵顯示異常

解決方案:在AndroidManifest.xml文件里,找到修改密碼界面,添加一個透明背景,保持和登錄界面設置一樣,鍵盤刪除鍵顯示恢復正常。但是這里有一個問題:Activity的背景是否透明會影響到鍵盤的顯示嗎?我問了公司李老師,他說這個樣式可能影響到了button的顯示,具體原因還不清楚。現在問題時解決了,但是原因還不夠明確。

android:theme="@android:style/Theme.Translucent"
登錄界面設置
修改密碼界面設置

2、后臺返回數據解析異常,導致無法登錄成功

現象描述:客戶端用賬號、密碼、驗證碼去后臺請求數據時,一直顯示登錄中,請稍等。

一直顯示等待層

解決方案:用Debug調試,顯示已經從后臺請求到數據,在用Gson把JsonObject解析成泛型類是出現異常,所以導致沒有走成功的回調。

拿到后臺數據,解析成泛型類異常

程序進入了異常,顯示重復字段MSG

java.lang.IllegalArgumentException: class com.yitong.ares.app.android.entity.login.AresLoginVo declares multiple JSON fields named MSG

然后我在實體類AresLoginVo發現沒有重復字段啊,于是浪費了很長時間在糾結,為什么jsonObject轉換成泛型類會出錯呢?難道是Gson的bug?????

最后發現,原來AresLoginVo繼承了一個基類,基類里已經有了MSG字段,所以出現了重復。刪除重復字段后,解析成功,走了成功回調,登錄成功。

開始下載資源包

總結:后臺返回字段跟我們實體類里的字段數量不一定一一對應,Gson只會解析我們實體類里包含的字段。但是字段名字一定要相同,且不能重復,不然就會解析不到或者解析出錯。


3、接收到后臺數據,用Gson解析成泛型類時異常

現象描述:登錄界面,一直提示“加載中,請稍候....”

登錄界面顯示

問題解決:Debug發現,在登錄時,會去后臺請求數據,得到的數據解析成JsonObject,然后再解析成當前類。在解析成當前類時異常

得到數據如下:

{
  "NAME": "汪文龍",
  "LAST_LGN_DATE": "2017-04-05",
  "STATUS": "1",
  "ORG_ID": "010000",
  "LAST_LGN_TIME": "14:08:06",
  "MSG": "交易成功!",
  "USE_FIRST_MARK": "1",
  "ROLE_IDS": "1009,1020,4",
  "MOBILE": "13655668899",
  "SEX": "",
  "LOGINTOKEN": "4933644553CD06DC40b8bdd8c1704170",
  "EXT_ORG_ID": "",
  "USER_TYP_DESC": "0"
}

解析報的錯誤:

java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: com.yitong.ares.app.android.entity.login.AresLoginVo. Forgot to register a type adapter?

大概意思是:

java.lang.unsupportedoperationexception :試圖序列化java.lang.class : com.yitong.ares.app.android.entity.login.aresloginvo.忘記注冊類型適配器?

我仔細看了我的實體類,核對了字段,沒有發現什么問題。最后請教大神,他讓我刪除HttpUtils里一行log打印的代碼:

           try {
                //String轉換為JsonObject
                JsonObject jsonObj = new JsonParser().parse(decryData).getAsJsonObject();
                if (classOfT == String.class) {
                    msg.what = 1;
                    msg.obj = jsonObj.toString();
                } else {
                    //JsonObject轉換為泛型類
                    T result = new Gson().fromJson(jsonObj, classOfT);
                    msg.what = 1;
                    msg.obj = result;
                    Log.d(TAG, "analysisReturn: "+new Gson().toJson(result.getClass()));//刪除改行代碼
                }
            } catch (Exception e1) {
                msg.what = 0;
                msg.arg1 = RequestErrorInfo.ERROR_CODE_JSON_PARSE;
                msg.obj = RequestErrorInfo.getError(e1, RequestErrorInfo.ERROR_CODE_JSON_PARSE, e1.getMessage(), url);
            }

然后解析成功。

總結:我當初加這一行代碼是因為我想看一下,每次調用時有沒有解析成當前類。最后大神跟我說,這里寫的有錯誤,應該去掉getClass().


4、華為手機顯示H5頁面字體顯示異常,但在其他手機上顯示正常

現象描述:

華為手機顯示異常

中興手機正常顯示

問題解決:我初步懷疑是手機型號不兼容,前端說是我這webview瀏覽器問題。
總結:目前還沒解決,請大神給予解釋


5、解決華為手機連不上電腦,Android studio不顯示設備問題

現象描述:公司提供的華為p9測試機,連在電腦上沒反應,開發者選項和Usb調試都打開了,我下載了豌豆莢、360手機助手都連接不上。
問題解決:我今天閑著沒事,又來搞這個問題。根據華為手機助手未連接給的提示,我連接上了,下面在總結里提出注意事項。
總結:
①設置---高級設置---安全----勾選“允許HiSuite通過HDB連接設備”

如圖

②USB連接方式改為MTP,而不是僅充電

如圖

③、設置----關于手機----連續點擊版本號,進入開發者模式---開發者調試和USB調試都打開

打開開發者選項
打開USB調試

完成了以上操作如果還是連不上,那只有一個辦法,,,,,,把手機砸了試試


6、webVeiw加載H5頁面白屏,導致手機卡屏

現象描述:點擊信用卡申請,開始加載H5頁面,顯示白屏;返回后一直卡屏。如果一直在白屏界面,大概一二十分鐘后才會加載到頁面。

點擊信用卡申請

進去后白屏

問題解決:我加載其他頁面都沒問題,只有這個頁面有問題,初步懷疑前端頁面有問題。但是前端給的解釋是,ios加載都沒問題,而且自己在瀏覽器上打開這個頁面是沒問題的。那我。。。。咋搞?定位問題唄,找了一天的問題,最后加載了幾天前的資源包(前端代碼),發現沒問題。基本確定是前端這兩天改的代碼導致的。然后一點點比對,發現前端里面寫了一個不存在的圖片,我了個擦??頓時我真想把前端噴一頓,讓老子背了一天的鍋。結果前端給我的解釋是:為什么ios不報錯?這說明你們框架不完善,不夠健壯。我。。。。。。。。。。

問題在這里,image文件夾里根本不存在這個default_photo.png

總結:到這里我就幾個疑問了:
①、前端寫了一個不存在的圖片,為什么不報錯??
答:前端沒有編譯的工具,即使錯了,就會顯示默認圖片,不會報錯。
②:為啥ios加載webView時很快可以加在出來?android需要很沖時間加載?
答:我也不知道,求大神解釋。


7、根據名字、和日期查詢數據庫失敗

現象描述:輸入名字和日期查詢(時間段查詢,例如查詢大于2017-03-14,小于2017-03-17時間段的信息)失敗,單一條件查詢也不成功。但是根據身份證號查詢是可以的。

條件查詢
查詢條件

問題解決:
分析:身份證查詢可以的,說明我這個查詢功能是可以的。但是為什么根據名字和日期查詢怎么失敗了呢?我準備一個一個試驗,先用名字查詢,結果失敗了。我在想難道是查詢條件不能是中文?結果問了朋友,他說貌似是可以的,讓我把數據庫導出來看看,用可視化工具SQLiteExpertPers查看數據庫,而且可以執行sql語句,讓我試試。然后我下載軟件,結果手機里數據庫不能查看,更無法導出。想看的話有兩種辦法:一,root手機;二,用代碼實現把數據庫導出,并寫在內存卡里,就可以看到了。想想好麻煩啊,就在琢磨到底怎么回事?忽然腦子一轉,是不是我存在數據庫里的名字有空格? 或者我查詢時有空格?馬上debug查看存進去的信息,不看不知道,一看我了個草,真的有空格。問題找到了,去空格存儲, 去空格查詢,問題解決了。第二個問題,為什么日期不能查?這個結果我也早就預料到了,存的是個字符串,肯定無法比對大小的。但是日期怎么存才能比對呢?問了許多人說,日期存時間戳就可以比對了。但是時間戳格式好像是“2017-03-14 09:21:23”,這樣的年月日時分秒格式。但是前端給的格式是"2017-03-12"這樣的格式,這怎么比?最終還是找到了辦法,在查看代碼時發現了存了一個保存時間,long類型的,我能把查詢時間轉成long類型,不就可以比較了嗎?

locDataTable.setSAVE_TIME(Long.valueOf(System.currentTimeMillis()));//保存時間(查詢條件,必填)

結果找到了答案,在原來的字符串后面拼接上時分秒,再用SimpleDateFormat轉換,如下:

           if (!"".equals(startDate)) {

                //把"2017-04-13"這樣的類型轉換為"2017-04-13 00:00:00",再轉換為long類型的時間,再與數據庫里的SAVE_TIME的比較
                String startDate1=startDate+" 00:00:00";
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date=sdf.parse(startDate1);
                long startTime= date.getTime();

                //拼接查詢條件
                if (builder == null) {
                    builder = WhereBuilder.b("SAVE_TIME", ">=", startTime);
                } else {
                    builder = builder.and("SAVE_TIME", ">=", startTime);
                }
            }

完美解決了問題,搞了我大半天。

問題解決:
1、往數據庫里存數據一定要去空格,查詢條件也一定要去空格,不然很可能因為這個原因查不到
2、存日期數據,最好存long類型的,方便以后比對查詢

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容