Android网络编程之下菜单系统中的真机调试问题小结
下单系统的几个主要功能模块经过了模拟器的调试之后,我们连接了真机(小米2)进行调试,又发现了不少问题,经过一番排查逐一解决掉了,遂在此做一个小结。
1. 仍然是Android3.0以上系统主UI线程不能使用网络操作问题,我们加上下面2段代码即可,但这只是权宜之计,真正的解决办法是把所有网络操作放入线程中进行
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog() .penaltyDeath().build());
2. 服务器直接传回中文信息时,客户端显示乱码问题
解决办法:HttpUtil类中负责获得响应实体的方法参数中(无论Get与Post方式)附上编码格式,像这样:
// 判断是否请求成功 if (response.getStatusLine().getStatusCode() == 200) { // 获得响应 result = EntityUtils.toString(response.getEntity(), "gbk"); return result;
3. 客户点菜时,输入中文备注,传到服务器端数据库中变为乱码问题:
解决办法:在OrderDetailServlet的doGet方法中先设置request的编码格式:
req.setCharacterEncoding("utf-8");
且将JDBC获取数据库连接的url地址后附加如下参数:
url=jdbc:mysql://localhost:3306/wireless_db?useUnicode=true&characterEncoding=utf-8
即可正常向MySQL插入中文数据。
4. 查询订单明细时,中文传回客户端WebView中显示乱码问题:
解决办法:让WebView使用loadDataWithBaseURL()方法加载html格式的String,并且编码要设为utf-8
PayActivity.this.showOrderWebView.loadDataWithBaseURL(null, resultHtml, "text/html", "utf-8", null);
注:如果是模拟器的话,我们可以这样加载:
PayActivity.this.showOrderWebView.loadData(resultHtml, "text/html", "gbk");
并且客户端的html头部需要有编码格式声明:
<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">
(经测试,真机调试无需此头部元数据的声明)