Android RemoteViewFactory onDataSetChange被称为永久

Android RemoteViewFactory onDataSetChange被称为永久,android,firebase,google-cloud-firestore,android-widget,remoteview,Android,Firebase,Google Cloud Firestore,Android Widget,Remoteview,我有一个RemoteViewService,我从firebase获得一些数据,数据正确加载并显示。但问题是onDataSetChanget()被永远调用,数据被加载,然后一次又一次地重新加载。我还尝试将firebaseSnapShoatListener放在oncreate中并正在工作,但is存在一些问题。更清楚地说,只有在调用方法getData时才会永远调用onDataSetChanged。为什么onDataSetChanget()被调用“永远”吗 这是我的代码: public class T

我有一个RemoteViewService,我从firebase获得一些数据,数据正确加载并显示。但问题是onDataSetChanget()被永远调用,数据被加载,然后一次又一次地重新加载。我还尝试将firebaseSnapShoatListener放在oncreate中并正在工作,但is存在一些问题。更清楚地说,只有在调用方法getData时才会永远调用onDataSetChanged。为什么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;
        }
    }
}
公共类TaskWidgetService扩展了RemoteViewsService{
@凌驾
公共远程视图工厂onGetViewFactory(意图){
返回新TaskWidgetItemFactory(getApplicationContext(),intent);
}
类TaskWidgetItemFactory实现RemoteViewsFactory{
私人语境;
私有int-appWidgetId;
private List taskList=new ArrayList();
私有FirebaseFirestore firestore=FirebaseFirestore.getInstance();
private CollectionReference CollectionReference=firestore.collection(“用户”)
.document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.收集(“任务”);
私人收听者注册收听者注册;
公共任务WidgetItemFactory(上下文、意图){
this.context=上下文;
this.appWidgetId=intent.getIntExtra(AppWidgetManager.EXTRA\u APPWIDGET\u ID,
AppWidgetManager。无效的\u APPWIDGET\u ID);
}
@凌驾
public void onCreate(){
listenerRegistration=collectionReference.addSnapshotListener(新的EventListener(){
@凌驾
public void OneEvent(@Nullable QuerySnapshot queryDocumentSnapshots,@Nullable FirebaseFirestoreException e){
如果(e!=null){
//错误
}否则{
对于(DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
int oldIndex=dc.getOldIndex();
int newIndex=dc.getNewIndex();
DocumentSnapshot DocumentSnapshot=dc.getDocument();
Task Task=documentSnapshot.toObject(Task.class);
开关(dc.getType()){
案件补充:
taskList.add(newIndex,task);
AppWidgetManager.getInstance(上下文).notifyAppWidgetViewDataChanged(appWidgetId,R.id.tasks\u堆栈\u视图);
打破
已删除的案例:
任务列表。删除(旧索引);
AppWidgetManager.getInstance(上下文).notifyAppWidgetViewDataChanged(appWidgetId,R.id.tasks\u堆栈\u视图);
打破
案例修改:
打破
}
}
}
}
});
}
@凌驾
公共无效onDataSetChanged(){
//getData();
}
私有void getData(){
listenerRegistration=collectionReference.addSnapshotListener(新的EventListener(){
@凌驾
public void OneEvent(@Nullable QuerySnapshot queryDocumentSnapshots,@Nullable FirebaseFirestoreException e){
如果(e!=null){
//错误
}否则{
对于(DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
int oldIndex=dc.getOldIndex();
int newIndex=dc.getNewIndex();
DocumentSnapshot DocumentSnapshot=dc.getDocument();
Task Task=documentSnapshot.toObject(Task.class);
开关(dc.getType()){
案件补充:
taskList.add(newIndex,task);
打破
已删除的案例:
任务列表。删除(旧索引);
打破
案例修改:
打破
}
}
AppWidgetManager.getInstance(上下文).notifyAppWidgetViewDataChanged(appWidgetId,R.id.tasks\u堆栈\u视图);
}
}
});
}
@凌驾
公共空间{
listenerRegistration.remove();
}
@凌驾
public int getCount(){
返回taskList.size();
}
@凌驾
公共远程视图getViewAt(内部位置){
RemoteViews RemoteView=新的RemoteView(context.getPackageName(),R.layout.widget_项);
setextviewtext(R.id.widget_text_view_task_name,taskList.get(position.getName());
setextviewtext(R.id.text\u view\u time\u小部件,taskList.get(position.getTime());
setextviewtext(R.id.text\u view\u date\u小部件,taskList.get(position.getDate());
返回远程视图;
}
@凌驾
公共远程视图getLoadingView(){
返回null;
}
@凌驾
public int getViewTypeCount(){
返回1;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共布尔表ID(){
返回true;
}
}
}