片段视图返回后执行的 Firebase 查询

Posted

技术标签:

【中文标题】片段视图返回后执行的 Firebase 查询【英文标题】:Firebase query executing after fragment view has been returned 【发布时间】:2021-01-25 16:54:54 【问题描述】:

我有一个扩展 Fragment 的类,并在其 onCreateView 方法中包含对 Firebase 的查询。用调试器分析程序后,我意识到这个查询直到视图返回后才执行。

查询返回将加载到回收站视图中的信息。我还为数据本身创建了一个适配器。该代码不会产生任何错误,但它没有按应有的方式运行。 理想情况下,查询应该首先执行,这样我才能在这个 recyclerview 上显示数据。知道为什么会这样吗?

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState)

    final View view=inflater.inflate(R.layout.frag_events, container, false);
    eventIds =new ArrayList<String>();

    //executes after view has been returned
    ValueEventListener eventIdValListener=new ValueEventListener()
    
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot)
        
            eventIds.clear();
            if(snapshot.exists())
            
                for (DataSnapshot e : snapshot.getChildren())
                
                    String event = e.getValue(String.class);
                    eventIds.add(event);
                
            
        

        @Override
        public void onCancelled(@NonNull DatabaseError error)
        

        
    ;
    //returns data for current user 
    Query query=FirebaseDbSingleton.getInstance().dbRef.child("User").child(FirebaseDbSingleton.getInstance().user.getUid().toString()).child("events");
    query.addValueEventListener(eventIdValListener);
    
    return view;

我为回收器和适配器省略了一些行,只是为了保持这段代码简短。我感觉这可能是由于 eventIdValListener 中的内部类,但我不完全确定。

【问题讨论】:

【参考方案1】:

所有查询数据库的 Firebase API 都是异步的,并在调用后一段时间后完成。你不可能在onCreateView 返回之前完成它 - 它必须立即返回一个 View 实例。

由于您不知道查询完成需要多长时间,并且无法保证多长时间,您需要添加逻辑以在查询完成之前显示某些内容(例如等待指示器)。这是任何执行网络或数据库操作的应用程序的标准。

【讨论】:

以上是关于片段视图返回后执行的 Firebase 查询的主要内容,如果未能解决你的问题,请参考以下文章

任何更改后的 Android Firebase 数据库活动/片段正在关闭

从firebase检索图像以在片段中的回收器视图时出错

工具栏视图引用从对话框片段返回后变为空

转到不在底部导航视图内的片段并返回后,底部导航视图不起作用

Firebase 查询后返回 Promise

从对话框片段返回后,工具栏视图引用变为null