android - Firebase 数据库不提交在线数据阻塞监听器

标签 android firebase firebase-realtime-database

我正在使用 Firebase 数据库服务来同步用户数据。 我启用了离线兼容性,问题是在使用几个月后,用户数据显然没有提交到在线数据库中,因为用户电话系统阻止了应用程序的互联网连接。

在某些情况下,我设法引导用户启用“无限数据使用”选项,但并不适用于所有人。

在我的例子中,问题是听众:

void onDataChange(DataSnapshot var1);

来自 ValueEventListener,当大量数据离线存储且未提交时不会触发,并且会阻止所有行为。

我没有在线存储限制,因为我有 Blaze 计划(按消费付费)。

事务也未提交,并触发“事务被后续集覆盖”,错误代码为 -9。

The Connection detector Firebase 提供的始终打印“未连接”

我还尝试将 goOffline()goOnline() 交替使用,但没有任何反应。

我不明白为什么手机会阻止我的应用程序同步并让 Facebook 和 Youtube 等应用程序消耗大量互联网数据。

此行为仅发生在 Android 设备上,在使用相同 Firebase 数据库的 iOS 手机上没有问题。

不适用于 4g、WI-FI 或 VPN(使用 Opera VPN)。

更新 1:

日志在启动时包含约 10 次:

11-13 21:12:28.477 15765 15856 D PersistentConnection: pc_0 - Scheduling connection attempt
11-13 21:12:28.477 15765 15856 D ConnectionRetryHelper: Scheduling retry in 26091ms
11-13 21:12:54.597 15765 15856 D PersistentConnection: pc_0 - Trying to fetch auth token
11-13 21:12:55.747 15765 15856 D PersistentConnection: pc_0 - Error fetching token: An internal error has occurred. [ 
TOKEN_EXPIRED ]

当我尝试插入新数据时:

RepoOperation: Aborting transactions for path: [the path]

最佳答案

经过长时间的调查,我发现 token 没有自动刷新。

首先,检查当前用户是否使用FirebaseAuth.AuthStateListener登录

检查是否需要刷新 token

1) 检查应用程序是否有互联网连接:

    public static boolean isOnline(Context context)
    {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

        return networkInfo != null && networkInfo.isConnectedOrConnecting();
    }

2) 然后我检查数据库是否连接到: Detecting Connection State

如果应用程序有互联网连接但数据库未连接,那么我会尝试刷新 token :

try
{
    user.getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>()
    {
        @Override
        public void onComplete(@NonNull Task<GetTokenResult> task)
        {
            if (task.isSuccessful())
            {
                //succcess
            } else
            {
                //need login again
            }
        }
    });
}catch(Exception e)
{
    //need login again
}

如果出现异常或完成任务失败,我会尝试重新登录用户。在大多数情况下将是透明登录,因此不会向用户显示,因为将使用已由 sdk 本身存储的凭据。

我认为这是一个 hack,因为它只影响少数用户,所以它是一个 sdk 错误。

关于android - Firebase 数据库不提交在线数据阻塞监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47140222/

相关文章:

android - Android GCM 注册 ID 是否始终以 "APA"开头?

android - 如何在 Android 中停止 Firebase 事件监听器?

javascript - 等待查询实时更新然后返回值 [Vuex ,Firestore]

android - 当 Activity 暂停或停止时删除事件监听器

java - Firebase - 如何检索数据库项目的 ID?

javascript - 新用户的 Firebase 数据库安全

android popupwindow float 在父 View 之外

android - 发送退格键事件以编辑文本

java - 如何导出使用 Gson jar 的项目的 jar 文件

angular - 将数据添加到 Firebase Cloud Firestore 和 Angular