У меня есть RemoteViewService, в котором я получаю некоторые данные из базы данных, данные загружаются правильно и отображаются. Но проблема в том, что onDataSetChanget () вызывается навсегда, и данные загружаются, а затем перезагружаются и снова, и снова. Я также пытался поместить firebaseSnapShoatListener в oncreate и работает, но у него есть некоторые проблемы. Чтобы быть более ясным - onDataSetChanged вызывается всегда, только когда я вызываю метод getData. Почему onDataSetChanget () вызывается навсегда?
Это мой код:
public class TaskWidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new TaskWidgetItemFactory(getApplicationContext(), intent);
}
class TaskWidgetItemFactory implements RemoteViewsFactory {
private Context context;
private int appWidgetId;
private List<Task> taskList = new ArrayList<>();
private FirebaseFirestore firestore = FirebaseFirestore.getInstance();
private CollectionReference collectionReference = firestore.collection("Users")
.document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.collection("Tasks");
private ListenerRegistration listenerRegistration;
public TaskWidgetItemFactory(Context context, Intent intent) {
this.context = context;
this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
@Override
public void onCreate() {
listenerRegistration = collectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null) {
//error
} else {
for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
int oldIndex = dc.getOldIndex();
int newIndex = dc.getNewIndex();
DocumentSnapshot documentSnapshot = dc.getDocument();
Task task = documentSnapshot.toObject(Task.class);
switch (dc.getType()) {
case ADDED:
taskList.add(newIndex, task);
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.tasks_stack_view);
break;
case REMOVED:
taskList.remove(oldIndex);
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.tasks_stack_view);
break;
case MODIFIED:
break;
}
}
}
}
});
}
@Override
public void onDataSetChanged() {
// getData();
}
private void getData() {
listenerRegistration = collectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null) {
//error
} else {
for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
int oldIndex = dc.getOldIndex();
int newIndex = dc.getNewIndex();
DocumentSnapshot documentSnapshot = dc.getDocument();
Task task = documentSnapshot.toObject(Task.class);
switch (dc.getType()) {
case ADDED:
taskList.add(newIndex, task);
break;
case REMOVED:
taskList.remove(oldIndex);
break;
case MODIFIED:
break;
}
}
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.tasks_stack_view);
}
}
});
}
@Override
public void onDestroy() {
listenerRegistration.remove();
}
@Override
public int getCount() {
return taskList.size();
}
@Override
public RemoteViews getViewAt(int position) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_item);
remoteViews.setTextViewText(R.id.widget_text_view_task_name, taskList.get(position).getName());
remoteViews.setTextViewText(R.id.text_view_time_widget, taskList.get(position).getTime());
remoteViews.setTextViewText(R.id.text_view_date_widget, taskList.get(position).getDate());
return remoteViews;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
}
}