在Android中等待Firebase异步检索数据

Posted

技术标签:

【中文标题】在Android中等待Firebase异步检索数据【英文标题】:Wait Firebase async retrieve data in Android 【发布时间】:2016-02-16 19:53:37 【问题描述】:

我需要自己存储异步的 FireBase getValue 方法的结果。我不能使用“onPostExecute()”之类的东西,而且出于我的目的,我不能将所有操作“执行到 onDataChange()”中,因为我需要在未来的其他活动中提供一些参考。

这里是我的 sn-p 检索数据:

    List<Village> villages = new LinkedList<>();
    Firebase ref = new Firebase("MYFIREBASEURL").child("village");
    ref.addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot snapshot) 
            spinnerArray.clear();
            for (DataSnapshot postSnapshot : snapshot.getChildren()) 
                Village v = postSnapshot.getValue(Village.class);
                villages.add(v);
            
        

        @Override
        public void onCancelled(FirebaseError firebaseError) 
            System.out.println("The read failed: " + firebaseError.getMessage());
        
    );

如果我尝试从“onDataChange”中读取村庄,对于他的异步生活,我自然会得到 null 值。有办法确保 onDataChange 被调用?

【问题讨论】:

您需要将您的需求重新表述为“每当数据发生变化时,我想做 ABC”。或者您可以等待数据,这可能只是一般不推荐。有关详细信息/示例,请参阅此问答:***.com/questions/33203379/… 【参考方案1】:

您可以定义一个侦听器接口来处理它。 示例:

 public interface OnGetDataListener 
    public void onStart();
    public void onSuccess(DataSnapshot data);
    public void onFailed(DatabaseError databaseError);

我创建了一个自定义函数来获取 Database.class 中的数据:

  public void mReadDataOnce(String child, final OnGetDataListener listener) 
    listener.onStart();
   FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
            listener.onSuccess(dataSnapshot);
        

        @Override
        public void onCancelled(DatabaseError databaseError) 
            listener.onFailed(databaseError);
        
    );

当我想从 Main.class 中获取数据时,我会这样做:

private void mCheckInforInServer(String child) 
    new Database().mReadDataOnce(child, new OnGetDataListener() 
        @Override
        public void onStart() 
            //DO SOME THING WHEN START GET DATA HERE
        

        @Override
        public void onSuccess(DataSnapshot data) 
           //DO SOME THING WHEN GET DATA SUCCESS HERE
        

        @Override
        public void onFailed(DatabaseError databaseError) 
           //DO SOME THING WHEN GET DATA FAILED HERE
        
    );


通过这种方式,您可以重用您的方法并处理数据。

【讨论】:

这并不能解决问题。异步调用照常进行,仅在需要数据后才检索数据。【参考方案2】:

为了补充 Manh 的答案,有人会在之前致电 onStart()

 FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() 

onStart() 中,通常你会显示一个progressDialog:

    if (mProgressDialog == null) 
        mProgressDialog = new ProgressDialog(getContext());
        mProgressDialog.setMessage(getString(R.string.loading));
        mProgressDialog.setIndeterminate(true);
    

    mProgressDialog.show();

onSuccess() 中关闭对话框并将数据加载到 GUI 上(或任何您想做的事情)

    if (mProgressDialog != null && mProgressDialog.isShowing()) 
        mProgressDialog.dismiss();
    

【讨论】:

【参考方案3】:

我的理解是您正在尝试将快照数据保存到变量中,但由于异步任务,变量结果为空,这是因为异步任务的性质,您可以做的是传递快照数据从firebase侦听器函数到外部的自定义函数,并将快照数据存储到全局变量中。然后您可以随意使用该变量。

【讨论】:

以上是关于在Android中等待Firebase异步检索数据的主要内容,如果未能解决你的问题,请参考以下文章

等待 firebase 加载,直到显示 View

Flutter Firebase异步查询未在流函数中检索数据

Vue.js:从 Firebase 存储中检索数据后如何异步加载模板?

如何在 Android 中使用 MVC 模式从 firebase 检索数据? [复制]

发送数据时,从 Android 应用中的 Firebase 检索 ServerValue.Timestamp

如何根据 android 中的用户位置从 Firebase 数据库中检索数据?