如何解决unregisterReceiver()泄漏错误及本地数据同步MySQL失败问题
嘿,我来帮你一步步解决这两个问题:首先是那个烦人的IntentReceiverLeaked错误,然后是数据发不到服务器的问题。
一、先搞定广播接收器泄漏的问题
这个错误的原因很明确:你的MainActivity被销毁的时候,没有注销之前注册的两个广播接收器,导致系统认为这些接收器还在占用资源。按下面的步骤修改代码就能解决:
把
NetworkStateChecker存为成员变量
你现在是在onCreate里直接new了一个匿名的NetworkStateChecker,后面没法注销它。所以先在MainActivity的成员变量里加一行:private NetworkStateChecker networkStateChecker;修改注册代码
把原来的匿名注册改成用成员变量:// 替换掉 onCreate 里的这行:registerReceiver(new NetworkStateChecker(), ...) networkStateChecker = new NetworkStateChecker(); registerReceiver(networkStateChecker, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));重写
onDestroy方法注销接收器
在MainActivity里添加这个方法,确保Activity销毁时清理掉注册的接收器:@Override protected void onDestroy() { super.onDestroy(); // 注销自定义的广播接收器 if (broadcastReceiver != null) { unregisterReceiver(broadcastReceiver); } // 注销网络状态检查的接收器 if (networkStateChecker != null) { unregisterReceiver(networkStateChecker); } }
这样那个泄漏错误就彻底解决了。
二、解决数据无法同步到服务器的问题
既然Postman测试PHP脚本正常,那问题肯定出在Android端,咱们挨个排查:
1. 先检查权限是否配全
确保你的AndroidManifest.xml里有这两个必要的网络权限,没有的话App根本连不上网:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2. 给输入内容加个非空判断
你现在的代码里没有检查输入框是不是空的,如果用户点了按钮但没输入内容,会把空值发给服务器,可能PHP脚本返回错误,但你的代码会把空值存到本地。加个判断:
final String name = editTextName.getText().toString().trim(); if (name.isEmpty()) { editTextName.setError("请输入内容再提交"); return; }
3. 调试Volley的错误信息
你的Volley错误回调里只做了本地存储,没打印具体错误,这很难排查。修改错误回调,把详细错误打出来:
new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { progressDialog.dismiss(); // 打印错误日志,方便排查问题 Log.e("SyncFail", "同步错误: " + error.getMessage()); if (error.networkResponse != null) { Log.e("SyncFail", "状态码: " + error.networkResponse.statusCode); Log.e("SyncFail", "服务器返回内容: " + new String(error.networkResponse.data)); } saveNameToLocalStorage(name, NAME_NOT_SYNCED_WITH_SERVER); } }
然后看Logcat里的输出,就能知道是连接超时、参数不匹配还是其他问题了。
4. 检查NetworkStateChecker的逻辑
从错误信息看你用了这个网络状态检查器,但没贴它的代码。这个类的作用应该是在网络恢复时,自动同步本地未同步(status=0)的数据到服务器。如果这个类逻辑有问题,比如没正确查询本地未同步数据、没调用同步接口,那本地的待同步数据就一直发不出去。
确保这个类里做了这些事:
- 检测到网络可用时,查询本地数据库中所有
status=NAME_NOT_SYNCED_WITH_SERVER的数据 - 逐个把这些数据发送到服务器,成功后更新本地数据的status为
NAME_SYNCED_WITH_SERVER
5. 确认本地数据库插入逻辑没问题
检查DatabaseHelper的insert方法,确保它正确把name和status插入到数据库里。可以在插入后查一下数据库,确认数据确实被存进去了。
内容的提问来源于stack exchange,提问作者Swaraj Kaushal

