问题描述
我想通过聊天活动 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();
}
}
}