You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

安卓真机从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表的数据量很大,给groupNamecMonth字段加联合索引,能加速查询:

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

火山引擎 最新活动