Firebase onComplete 从未在 Android 10 中调用过

问题描述

我想通过聊天活动 onResume 和 onPause 方法更改 firebase 实时数据库中的状态(在线/离线)。

我的代码如下:

@Override
protected void onResume() {
    super.onResume();
    updateStatus(Constants.getInstance().userStatusOnline);
}

@Override
protected void onPause() {
    super.onPause();
    updateStatus(Constants.getInstance().userStatusOffline);
}

public void updateStatus(String status) {
    Log.e(TAG,"## updateStatus status : " + status);
    if (myUserId != null) {
        databaseReference = FirebaseDatabase.getInstance().getReference(Constants.getInstance().fb_table_user).child(myUserId);

        HashMap<String,Object> hashMap = new HashMap<>();
        hashMap.put("status",status);

        databaseReference.updateChildren(hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Log.e(TAG,"******* updateStatus onComplete isSuccessful :: " + task.isSuccessful());

            }
        });
    }
}

它在其他安卓版本中运行良好,但 在 Android 10 中未调用 onComplete 方法。 我也尝试过在作业调度程序和工作经理中更新孩子,但没有奏效。

我到处都读过 FirebaseDatabase 操作在后台线程上异步执行

预先感谢您的帮助。

解决方法

我已经创建了如下所示的工作管理器,并覆盖了 addOnFailureListener 和 addOnCanceledListener 方法及其现在的工作。

public class ChangeStatusScheduler extends Worker {

private String TAG = "ChangeStatusScheduler";
private String status,userId;


public ChangeStatusScheduler(@NonNull Context appContext,@NonNull WorkerParameters params) {
    super(appContext,params);
    status = params.getInputData().getString(Constants.getInstance().fb_user_status);
    userId = params.getInputData().getString(Constants.getInstance().fb_user_id);
}

@NonNull
@Override
public Result doWork() {
    Log.e(TAG,"******* doWork");
    try {
        HashMap<String,Object> hashMap = new HashMap<>();
        hashMap.put(Constants.getInstance().fb_user_status,status);

        DatabaseReference statusRef =  FirebaseDatabase.getInstance().getReference(Constants.getInstance().fb_table_user)
                .child(userId);

        statusRef.updateChildren(hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Log.e(TAG,"******* onComplete");

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                e.printStackTrace();
                Log.e(TAG,"******* onFailure  ee :: " + e.getMessage());
            }
        }).addOnCanceledListener(new OnCanceledListener() {
            @Override
            public void onCanceled() {
                Log.e(TAG,"******* onCanceled");
            }
        });
    }catch (Exception ee){
        Log.e(TAG,"******* updateStatus ee :: " + ee.getMessage());
        ee.printStackTrace();
    }
    return Result.success();
}
}

并像下面这样称呼那个工作经理

@Override
protected void onStop() {
    super.onStop();

    Log.e(TAG,"******* chat onStop backClicked :: " + backClicked);
    if (!backClicked) {
        try {
            Data inputData = new Data.Builder()
                    .putString(Constants.getInstance().fb_user_status,Constants.getInstance().userStatusOffline)
                    .putString(Constants.getInstance().fb_user_id,myUserId).build();

            final OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(ChangeStatusScheduler.class).setInputData(inputData).build();
            WorkManager.getInstance().enqueue(workRequest);
        } catch (Exception ee) {
            Log.e(TAG,"******* updateStatus ee :: " + ee.getMessage());
            ee.printStackTrace();
        }
    }
}