Android firebase获取null

Android firebase获取null,第1张

概述我正在使用Firebase来保存我的数据.我正在尝试将Firebase方法和我的方法分离到活动上.例如,我创建了一个名为“FirebaseMethodsHelper”的类,我想编写所有Firebase方法.例如,“getAllUsers”方法应该在列表中返回所有用户.我唯一的问题是它不起作用.我不知道我做错了什么,所以如

我正在使用Firebase来保存我的数据.我正在尝试将Firebase方法和我的方法分离到活动上.例如,我创建了一个名为“FirebaseMethodsHelper”的类,我想编写所有Firebase方法.
例如,“getAllUsers”方法应该在列表中返回所有用户.
我唯一的问题是它不起作用.

我不知道我做错了什么,所以如果你们,请帮助我.

分段

  public class MyPlayListFragment extends Fragment {    private FirebaseDatabase refToVIDeos;    private FirebaseUser currentUser;    private ArrayList<VIDeo> vIDeosList;    private VIDeoVIEwAdapter adapter;    private RecyclerVIEw rvVIDeos;    private List<VIDeo> checkList;public MyPlayListFragment() {    // required empty public constructor}@OverrIDepublic VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container,                         Bundle savedInstanceState) {    // Inflate the layout for this fragment    VIEw v = inflater.inflate(R.layout.fragment_my_play_List, container, false);    rvVIDeos = (RecyclerVIEw)v.findVIEwByID(R.ID.rvVIDeos);    return v;}@OverrIDepublic voID onVIEwCreated(VIEw vIEw, @Nullable Bundle savedInstanceState) {    super.onVIEwCreated(vIEw, savedInstanceState);    vIDeosList = new ArrayList<>();    refToVIDeos = FirebaseDatabase.getInstance();    currentUser = FirebaseAuth.getInstance().getCurrentUser();    FirebaseMethodsHelper fmh = new FirebaseMethodsHelper();    checkList = fmh.getAllVIDeosFromDB(currentUser);    if(checkList != null)    Log.d("checkList",checkList.toString());

FirebaseMethodHelper类

   public class FirebaseMethodsHelper {private FirebaseDatabase databaseRef;private ArrayList<User> usersList;private ArrayList<VIDeo> vIDeosList;   public List<VIDeo> getAllVIDeosFromDB(FirebaseUser currentUser){        databaseRef = FirebaseDatabase.getInstance();        databaseRef.getReference(Params.VIDEOS).child(currentUser.getUID()).addListenerForSingleValueEvent(new ValueEventListener() {            @OverrIDe            public voID onDataChange(DataSnapshot dataSnapshot) {                for (DataSnapshot snapshot : dataSnapshot.getChildren()){                    vIDeosList.add(snapshot.getValue(VIDeo.class));                }            }            @OverrIDe            public voID onCancelled(DatabaseError databaseError) {            }        });    return vIDeosList;  } }

我不知道为什么,但它总是返回null.

解决方法:

这是异步Web API的典型问题:您现在无法返回尚未加载的内容.

Firebase数据库(和大多数现代Web API)数据是异步加载的,因为它可能需要一些时间.在将数据加载到辅助线程上时,主应用程序代码将继续,而不是等待数据(这将导致用户的应用程序无响应对话框).然后,当数据可用时,将调用onDataChange()方法并可以使用该数据.

这会更改您应用的流量.最简单的方法是查看几个日志语句:

public List<VIDeo> getAllVIDeosFromDB(FirebaseUser currentUser){    databaseRef = FirebaseDatabase.getInstance();    System.out.println("Before attaching Listener");    databaseRef.getReference(Params.VIDEOS).child(currentUser.getUID()).addListenerForSingleValueEvent(new ValueEventListener() {        @OverrIDe        public voID onDataChange(DataSnapshot dataSnapshot) {            System.out.println("Got data");        }        @OverrIDe        public voID onCancelled(DatabaseError databaseError) {            throw databaseError.toException(); // don't ignore errors        }    });    System.out.println("After attaching Listener");}

运行此代码将打印以下序列:

Before attaching Listener

After attaching Listener

Got data

这可能不是您所期望的,但是当您返回数组时,它正好解释了为什么数组为空.

大多数开发人员的初始响应是尝试“修复”这种异步行为.我建议不要这样做:网络是异步的,越早接受,您就越早了解如何通过现代Web API提高工作效率.

我发现为这个异步范例重构问题最容易.我没有说“首先获取所有视频,然后记录它们”,而是将问题定位为“开始获取所有视频.当视频加载时,请记录它们”.

这意味着任何需要视频的代码必须位于onDataChange()内部(或从内部调用).例如.:

public List<VIDeo> getAllVIDeosFromDB(FirebaseUser currentUser){    databaseRef = FirebaseDatabase.getInstance();    databaseRef.getReference(Params.VIDEOS).child(currentUser.getUID()).addListenerForSingleValueEvent(new ValueEventListener() {        @OverrIDe        public voID onDataChange(DataSnapshot dataSnapshot) {            for (DataSnapshot snapshot : dataSnapshot.getChildren()){                vIDeosList.add(snapshot.getValue(VIDeo.class));            }            if (vIDeosList != null) {                Log.d("checkList",vIDeosList.toString());            }        }        @OverrIDe        public voID onCancelled(DatabaseError databaseError) {            throw databaseError.toException(); // don't ignore errors        }    });}

正如我所说,对于之前没有处理异步API的开发人员来说,这是一个常见问题.因此,已经有很多关于这个主题的问题,我建议你也检查一下:

> Setting Singleton property value in Firebase Listener
> Handle data returned by an Async task (Firebase)(显示如何定义和传递您自己的回调)
> Firebase – Android – fetchProvidersForEmail – Why are all the calls asynchronous?(有更多其他类似问题的链接)

总结

以上是内存溢出为你收集整理的Android firebase获取null全部内容,希望文章能够帮你解决Android firebase获取null所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1100800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存