安卓真机从PHP服务器获取数据过慢问题求助
我来帮你梳理下可能的问题点和优化方向,结合你提供的代码来看:
1. 客户端代码的明显bug
首先看你的TestBackground类里的doInBackground方法,读取服务器响应的时候有个严重问题:
String line; while ((line= bufferedReader.readLine())!=null) result = line;
这里每次循环都会把result覆盖成当前行,而不是累加所有行!如果服务器返回的JSON数据有多行(比如格式化后的JSON),你只能拿到最后一行,导致解析失败或者数据不完整。虽然模拟器可能刚好返回单行数据,但真实设备网络传输中可能分块,或者服务器返回多行,这不仅会导致数据错误,也可能因为解析异常间接导致耗时增加。应该改成:
StringBuilder sb = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { sb.append(line); } result = sb.toString();
2. 网络请求的优化
替换老旧的HttpURLConnection
你现在用的HttpURLConnection是比较底层且老旧的网络库,推荐换成OkHttp或者Retrofit,它们自带连接池、超时管理、自动重试、Gzip压缩支持等优化,能显著提升真实网络环境下的请求效率,代码也会更简洁易维护。
设置超时时间
你的HttpURLConnection没有设置连接和读取超时,真实设备网络不稳定时,请求会一直挂着等待,导致用户觉得“耗时过长”。加上这两行:
httpURLConnection.setConnectTimeout(5000); // 5秒连接超时 httpURLConnection.setReadTimeout(10000); // 10秒读取超时
字符编码问题
你读取输入流用的是iso-8859-1,但服务器返回的是UTF-8的JSON,这可能导致乱码,甚至解析失败。改成UTF-8:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
3. 服务器端(PHP)的优化
避免不必要的LIKE查询
看你的PHP代码,WHERE UserName LIKE '$userName'和groupName LIKE '$value',这里明显是精确匹配,用=代替LIKE可以让数据库使用索引,大幅提升查询速度:
$sql = "SELECT GroupID FROM member_info WHERE UserName = '$userName';"; // 还有下面的查询 $sql = "SELECT * FROM cost WHERE groupName = '$value' and cMonth = '$month';";
另外,注意你的代码有SQL注入风险!应该用预处理语句(Prepared Statements)来避免注入,同时也能提升查询性能,比如:
$stmt = $conn->prepare("SELECT GroupID FROM member_info WHERE UserName = ?"); $stmt->bind_param("s", $userName); $stmt->execute(); $result = $stmt->get_result();
复用数据库连接
你的getCostList函数里又require"connection.php";,这会重复创建数据库连接,每次请求都建立新连接是很耗时的操作。应该在全局初始化一次连接,然后复用,不要每次查询都重新连接。
开启Gzip压缩
在PHP输出JSON前,开启Gzip压缩,减少传输的数据量:
ob_start("ob_gzhandler"); // 然后输出你的JSON echo json_encode($response); ob_end_flush();
优化SQL查询
如果cost表的数据量很大,给groupName和cMonth字段加联合索引,能加速查询:
CREATE INDEX idx_group_month ON cost(groupName, cMonth);
4. 异步任务的替代方案
AsyncTask已经被Android官方废弃了,推荐用Kotlin协程(如果是Java项目可以用RxJava或者ExecutorService),协程的线程管理更高效,也更易维护,避免AsyncTask可能的内存泄漏问题。
5. 真实设备特定问题排查
- 检查真实设备的网络环境:比如是否是移动数据、信号强度如何,用手机浏览器直接访问你的PHP接口,看看加载速度,如果浏览器访问也慢,那问题大概率在服务器或者网络本身。
- 测试DNS解析:有些地区的DNS解析慢,可以尝试用公共DNS(比如114.114.114.114)测试,看是否有改善。
- 检查是否有VPN/代理:真实设备如果开了VPN或者代理,可能会增加请求延迟。
你可以先修复客户端的result赋值bug,然后设置超时时间,再优化服务器端的SQL查询,这些应该能解决大部分问题。
内容的提问来源于stack exchange,提问作者ATIK FAYSAL




