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调试都打开
完成了以上操作如果还是连不上,那只有一个办法,,,,,,把手机砸了试试
6、webVeiw加载H5页面白屏,导致手机卡屏
现象描述:点击信用卡申请,开始加载H5页面,显示白屏;返回后一直卡屏。如果一直在白屏界面,大概一二十分钟后才会加载到页面。
问题解决:我加载其他页面都没问题,只有这个页面有问题,初步怀疑前端页面有问题。但是前端给的解释是,ios加载都没问题,而且自己在浏览器上打开这个页面是没问题的。那我。。。。咋搞?定位问题呗,找了一天的问题,最后加载了几天前的资源包(前端代码),发现没问题。基本确定是前端这两天改的代码导致的。然后一点点比对,发现前端里面写了一个不存在的图片,我了个擦??顿时我真想把前端喷一顿,让老子背了一天的锅。结果前端给我的解释是:为什么ios不报错?这说明你们框架不完善,不够健壮。我。。。。。。。。。。
总结:到这里我就几个疑问了:
①、前端写了一个不存在的图片,为什么不报错??
答:前端没有编译的工具,即使错了,就会显示默认图片,不会报错。
②:为啥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类型的,方便以后比对查询