安卓开发难点攻克记录(持续更新)


1、修改密码界面自定义键盘删除键显示异常

现象描述:两个页面加载的同一个键盘布局,但是显示时却存在差异

安卓开发难点攻克记录(持续更新)_第1张图片
其他界面键盘正常显示
安卓开发难点攻克记录(持续更新)_第2张图片
删除键显示异常

解决方案:在AndroidManifest.xml文件里,找到修改密码界面,添加一个透明背景,保持和登录界面设置一样,键盘删除键显示恢复正常。但是这里有一个问题:Activity的背景是否透明会影响到键盘的显示吗?我问了公司李老师,他说这个样式可能影响到了button的显示,具体原因还不清楚。现在问题时解决了,但是原因还不够明确。

android:theme="@android:style/Theme.Translucent"
安卓开发难点攻克记录(持续更新)_第3张图片
登录界面设置
安卓开发难点攻克记录(持续更新)_第4张图片
修改密码界面设置

2、后台返回数据解析异常,导致无法登录成功

现象描述:客户端用账号、密码、验证码去后台请求数据时,一直显示登录中,请稍等。

安卓开发难点攻克记录(持续更新)_第5张图片
一直显示等待层

解决方案:用Debug调试,显示已经从后台请求到数据,在用Gson把JsonObject解析成泛型类是出现异常,所以导致没有走成功的回调。

安卓开发难点攻克记录(持续更新)_第6张图片
拿到后台数据,解析成泛型类异常

程序进入了异常,显示重复字段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字段,所以出现了重复。删除重复字段后,解析成功,走了成功回调,登录成功。

安卓开发难点攻克记录(持续更新)_第7张图片
开始下载资源包

总结:后台返回字段跟我们实体类里的字段数量不一定一一对应,Gson只会解析我们实体类里包含的字段。但是字段名字一定要相同,且不能重复,不然就会解析不到或者解析出错。


3、接收到后台数据,用Gson解析成泛型类时异常

现象描述:登录界面,一直提示“加载中,请稍候....”

安卓开发难点攻克记录(持续更新)_第8张图片
登录界面显示

问题解决: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页面字体显示异常,但在其他手机上显示正常

现象描述:

安卓开发难点攻克记录(持续更新)_第9张图片
华为手机显示异常

安卓开发难点攻克记录(持续更新)_第10张图片
中兴手机正常显示

问题解决:我初步怀疑是手机型号不兼容,前端说是我这webview浏览器问题。
总结:目前还没解决,请大神给予解释


5、解决华为手机连不上电脑,Android studio不显示设备问题

现象描述:公司提供的华为p9测试机,连在电脑上没反应,开发者选项和Usb调试都打开了,我下载了豌豆荚、360手机助手都连接不上。
问题解决:我今天闲着没事,又来搞这个问题。根据华为手机助手未连接给的提示,我连接上了,下面在总结里提出注意事项。
总结:
①设置---高级设置---安全----勾选“允许HiSuite通过HDB连接设备”

安卓开发难点攻克记录(持续更新)_第11张图片
如图

②USB连接方式改为MTP,而不是仅充电

安卓开发难点攻克记录(持续更新)_第12张图片
如图

③、设置----关于手机----连续点击版本号,进入开发者模式---开发者调试和USB调试都打开

安卓开发难点攻克记录(持续更新)_第13张图片
打开开发者选项
安卓开发难点攻克记录(持续更新)_第14张图片
打开USB调试

完成了以上操作如果还是连不上,那只有一个办法,,,,,,把手机砸了试试


6、webVeiw加载H5页面白屏,导致手机卡屏

现象描述:点击信用卡申请,开始加载H5页面,显示白屏;返回后一直卡屏。如果一直在白屏界面,大概一二十分钟后才会加载到页面。

安卓开发难点攻克记录(持续更新)_第15张图片
点击信用卡申请

安卓开发难点攻克记录(持续更新)_第16张图片
进去后白屏

问题解决:我加载其他页面都没问题,只有这个页面有问题,初步怀疑前端页面有问题。但是前端给的解释是,ios加载都没问题,而且自己在浏览器上打开这个页面是没问题的。那我。。。。咋搞?定位问题呗,找了一天的问题,最后加载了几天前的资源包(前端代码),发现没问题。基本确定是前端这两天改的代码导致的。然后一点点比对,发现前端里面写了一个不存在的图片,我了个擦??顿时我真想把前端喷一顿,让老子背了一天的锅。结果前端给我的解释是:为什么ios不报错?这说明你们框架不完善,不够健壮。我。。。。。。。。。。

安卓开发难点攻克记录(持续更新)_第17张图片
问题在这里,image文件夹里根本不存在这个default_photo.png

总结:到这里我就几个疑问了:
①、前端写了一个不存在的图片,为什么不报错??
答:前端没有编译的工具,即使错了,就会显示默认图片,不会报错。
②:为啥ios加载webView时很快可以加在出来?android需要很冲时间加载?
答:我也不知道,求大神解释。


7、根据名字、和日期查询数据库失败

现象描述:输入名字和日期查询(时间段查询,例如查询大于2017-03-14,小于2017-03-17时间段的信息)失败,单一条件查询也不成功。但是根据身份证号查询是可以的。

安卓开发难点攻克记录(持续更新)_第18张图片
条件查询
安卓开发难点攻克记录(持续更新)_第19张图片
查询条件

问题解决:
分析:身份证查询可以的,说明我这个查询功能是可以的。但是为什么根据名字和日期查询怎么失败了呢?我准备一个一个试验,先用名字查询,结果失败了。我在想难道是查询条件不能是中文?结果问了朋友,他说貌似是可以的,让我把数据库导出来看看,用可视化工具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类型的,方便以后比对查询

你可能感兴趣的:(安卓开发难点攻克记录(持续更新))