You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决unregisterReceiver()泄漏错误及本地数据同步MySQL失败问题

解决方案:修复广播接收器泄漏 + 数据同步失败问题

嘿,我来帮你一步步解决这两个问题:首先是那个烦人的IntentReceiverLeaked错误,然后是数据发不到服务器的问题。

一、先搞定广播接收器泄漏的问题

这个错误的原因很明确:你的MainActivity被销毁的时候,没有注销之前注册的两个广播接收器,导致系统认为这些接收器还在占用资源。按下面的步骤修改代码就能解决:

  1. 把NetworkStateChecker存为成员变量
    你现在是在onCreate里直接new了一个匿名的NetworkStateChecker,后面没法注销它。所以先在MainActivity的成员变量里加一行:

    private NetworkStateChecker networkStateChecker;
    
  2. 修改注册代码
    把原来的匿名注册改成用成员变量:

    // 替换掉 onCreate 里的这行:registerReceiver(new NetworkStateChecker(), ...)
    networkStateChecker = new NetworkStateChecker();
    registerReceiver(networkStateChecker, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    
  3. 重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:16:17