У меня есть приложение чата, в котором я в настоящее время внедряю систему последнего просмотра / присутствия.Я храню онлайн-статус в базе данных Firebase Realtime.Если пользователь в сети, тогда значение этого ключа будет логическим true
, в противном случае это будет ServerValue.TIMESTAMP
, когда пользователь закрыл приложение.
Я использую addValueEventListener()
для прослушивания значения всякий раз, когда оно изменяется.Логика здесь в том, что если это значение не является логическим, то пользователь находится в автономном режиме, и в этом случае я вызываю метод getTimeAgo(long time)
.Проблема в том, что по какой-то причине переменная lastSeen
получит значение null
, когда приложение будет работать нормально, но в тот момент, когда я использую отладчик, чтобы точно определить, почему он возвращает ноль, он выполняется правильно?Я очень долго пытался это исправить и в конце концов сдался.Есть идеи?
public static String getTimeAgo(long time) {
final int SECOND_MILLIS = 1000;
final int MINUTE_MILLIS = 60 * SECOND_MILLIS;
final int HOUR_MILLIS = 60 * MINUTE_MILLIS;
final int DAY_MILLIS = 24 * HOUR_MILLIS;
if (time < 1000000000000L) {
// if timestamp given in seconds, convert to millis
time *= 1000;
}
long now = System.currentTimeMillis();
if (time > now || time <= 0) {
return null;
}
final long diff = now - time;
if (diff < MINUTE_MILLIS) {
return "just now";
} else if (diff < 2 * MINUTE_MILLIS) {
return "a minute ago";
} else if (diff < 50 * MINUTE_MILLIS) {
return diff / MINUTE_MILLIS + " minutes ago";
} else if (diff < 90 * MINUTE_MILLIS) {
return "an hour ago";
} else if (diff < 24 * HOUR_MILLIS) {
return diff / HOUR_MILLIS + " hours ago";
} else if (diff < 48 * HOUR_MILLIS) {
return "yesterday";
} else {
return diff / DAY_MILLIS + " days ago";
}
}
FirebaseDatabase.getInstance().getReference().child("users/" + bundle.getString("uid") + "/online").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String lastSeen;
if (dataSnapshot.getValue() instanceof Boolean)
lastSeen = "online";
else
lastSeen = getTimeAgo((long) dataSnapshot.getValue());
nameAndStatus.setText(TextUtils.concat(name, "\n", lastSeen));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(PersonalChat.this, "Couldn't get latest online status", Toast.LENGTH_LONG).show();
Log.w("Personal chat", databaseError.getMessage(), databaseError.toException());
}
});