【问题标题】:Firebase switch reading error when I update data更新数据时 Firebase 开关读取错误
【发布时间】:2017-05-08 14:40:13
【问题描述】:

我无法将我的 firebase 数据库中的布尔值状态读取到我拥有的开关中。

我不断收到空指针异常,但该值存在于数据库中,所以不确定我做错了什么

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.content.Context android.view.ViewGroup.getContext()'

片段

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.display_match_details_fragment, container, false);


    //FIREBASE
    mFirebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = mFirebaseAuth.getCurrentUser();
    final String uId = firebaseUser.getUid();

    mFirebaseDatabase = FirebaseDatabase.getInstance();
    usersDatabase = mFirebaseDatabase.getReference().child("users");
    groupsDatabase = mFirebaseDatabase.getReference().child("groups");

    tvAddedBy = (TextView) view.findViewById(R.id.tvAddedByMatchDisplay);
    tvMatchTime = (TextView) view.findViewById(R.id.tvMatchTime);
    tvMatchDay = (TextView) view.findViewById(R.id.tvMatchDay);
    switchPlaying = (Switch) view.findViewById(R.id.switchPlay);

    btnConfirmStatus = (Button) view.findViewById(R.id.btnPlayingConfirm);

    switchPlaying.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean playingExtra) {
            Snackbar.make(compoundButton, "Playing: " + playingExtra, Snackbar.LENGTH_SHORT)
                    .setAction("ACTION", null).show();
        }
    });



    btnConfirmStatus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


        }
    });



     readPlaying();


    return view;
}// end onCreate


// Read playing times from DB
private void readPlaying() {
    usersDatabase.child(firebaseUser.getUid()).child("playingExtra").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(!dataSnapshot.exists() || dataSnapshot.getValue() == null) {

                Toast.makeText(getActivity(), "NULL", Toast.LENGTH_SHORT).show();

            }
            else{
                Boolean playingExtra = Boolean.valueOf(dataSnapshot.getValue().toString());

                switchPlaying.setChecked(playingExtra);

            }
        }

全栈跟踪

05-08 15:57:00.461 2392-2601/com..squad E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb8e53e40
05-08 15:57:01.046 2392-2392/com.ciaranbyrne.squad E/AndroidRuntime: FATAL EXCEPTION: main

                                                                     java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.view.ViewGroup.getContext()' on a null object reference
                                                                         at android.support.design.widget.Snackbar.<init>(Snackbar.java:192)
                                                                         at android.support.design.widget.Snackbar.make(Snackbar.java:224)
                                                                         at com.ciaranbyrne.squad.DisplayMatchFragment$1.onCheckedChanged(DisplayMatchFragment.java:97)
                                                                         at android.widget.CompoundButton.setChecked(CompoundButton.java:156)
                                                                         at android.widget.Switch.setChecked(Switch.java:1070)
                                                                         at com.ciaranbyrne.squad.DisplayMatchFragment$3.onDataChange(DisplayMatchFragment.java:134)
                                                                         at com.google.android.gms.internal.zzajp.zza(Unknown Source)
                                                                         at com.google.android.gms.internal.zzakp.zzcxi(Unknown Source)
                                                                         at com.google.android.gms.internal.zzaks$1.run(Unknown Source)
                                                                         at android.os.Handler.handleCallback(Handler.java:739)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:168)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5845)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
05-08 15:57:15.694 2392-2601/com.ciaranbyrne.squad E/OpenGLRenderer: GL error:  Out of memory!

【问题讨论】:

  • 请添加您的数据库结构。
  • 首先,当发布有关崩溃的问题时,完整的堆栈跟踪有助于准确定位哪条线路出现故障。其次,错误消息意味着在故障线上,您正在执行类似&lt;ViewGroup&gt;.getContext() 的操作,但ViewGroupnull,所以我不确定Firebase 与它有什么关系。最后,如果值已使用reference.setValue(&lt;true/false&gt;); 设置,则只需要dataSnapshot.getValue(Boolean.class);
  • 根据建议添加了堆栈跟踪,我只是尝试使用 Boolean playingExtra = dataSnapshot.getValue(Boolean.class);但没有运气
  • 发布您的活动
  • 感谢您的评论,我对 Android 中的调试不太熟悉,但是根据您的建议查看堆栈跟踪后,它看起来与 SnackBar 有一些关系。仍在学习,但再次感谢您的提示

标签: android firebase firebase-realtime-database


【解决方案1】:

尝试使用

Snackbar.make(findViewById(android.R.id.content), "Playing: " + String.valueOf(playingExtra), Snackbar.LENGTH_SHORT)
                .setAction("ACTION", null).show();

【讨论】:

    【解决方案2】:

    假设您有一个看起来像这样的CoordinatorLayout

    CoordinatorLayout coordinatorLayout = (CoordinatorLayout) view.findViewById(R.id.coordinator_layout);
    

    要使用Snackbar类,请使用以下代码:

    Snackbar.make(coordinatorLayout, "Playing: " + playingExtra, Snackbar.LENGTH_LONG)
        .setAction("ACTION", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //do what you want
            }
         }).show();
    

    还可以尝试使用以下命令更改该行:

    dataSnapshot.getValue(Boolean.class);
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我对细节的理解不足以解释它们,但在片段的视图层次结构添加到封闭活动之前,在 Fragment 中创建 SnackBar 似乎存在问题 (related question) .

      您需要稍后在Fragment lifecycle 中执行readPlaying() 中的处理。将其移出onCreateView() 并移入onActivityCreated() 或稍后执行的某个生命周期方法,例如onStart()

      【讨论】:

        猜你喜欢
        • 2021-03-19
        • 2017-02-16
        • 1970-01-01
        • 2019-12-01
        • 2023-02-23
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 2017-01-22
        相关资源
        最近更新 更多