RemoteViewFactory onDataSetChange вызывается навсегда - PullRequest
1 голос
/ 21 марта 2020

У меня есть 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;
        }
    }
}
...