Поскольку вам нужно обновлять пользовательский интерфейс только тогда, когда он виден, вы можете уменьшить расход заряда батареи, обновляя свой пользовательский интерфейс только тогда, когда вы знаете, что он находится на переднем плане, используя обратные вызовы жизненного цикла onResume()
и onPause()
в вашем фрагменте / активности. Кроме того, если для вашего случая достаточно мелкой детализации, вы можете использовать системную трансляцию ACTION_TIME_TICK
, которая запускается каждую минуту, поэтому вам не нужно создавать собственный таймер без необходимости.
Сначала зарегистрируйте BroadcastReceiver
для прослушивания этой трансляции в onResume()
и отмените регистрацию в onPause()
:
@Override
public void onResume() {
final IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);
getContext().registerReceiver(receiver, filter);
}
@Override
public void onPause() {
getContext().unregisterReceiver(receiver);
}
Внутри receiver
, содержится логика для обновления соответствующих элементов вашего RecyclerView
(или делегируйте его вашему Adapter
, как пример:
final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
adapter.updateTimes();
}
}
//Inside your Adapter...
void updateTimes() {
for(int i = 0; i < notes.size(); i++) {
final Note note = notes.get(i);
//Pseudocode for determening whether or not an update it necessary
//Actual implementation will depend on how you handle updates
final String relative = getCurrentRelativeTimeString();
if(!Objects.equals(relative, note.getRelativeTimeString())) {
note.setRelativeTimeString(relative);
notifyItemChanged(i);
}
}
}