【问题标题】:Empty list exception while updating widget更新小部件时出现空列表异常
【发布时间】:2018-07-13 21:28:34
【问题描述】:

我正在尝试将数据从 firebase 传递到小部件,数据显示在调试中,但每次我将参数传递给小部件时应用程序都会崩溃,这是错误:

java.lang.NullPointerException:尝试调用虚拟方法 空对象上的“java.lang.String java.lang.Object.toString()” 参考在 com.example.amrkamal.textme.MainActivity$4.onDataChange(MainActivity.java:224) 在 com.google.android.gms.internal.firebase_database.zzfc.zza(未知 资料来源:13) 在 com.google.android.gms.internal.firebase_database.zzgx.zzdr(未知 来源:2) 在 com.google.android.gms.internal.firebase_database.zzhd.run(未知 来源:71) 在 android.os.Handler.handleCallback(Handler.java:790) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6494) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我取消了List<MessageModel> chatModelsArrayList;

这是我的代码,我在 onCreate 中编写了所有这些

chatModelsArrayList = new ArrayList<>();
     chatModelsArrayList.clear();
            DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
            databaseReference.child("messages").addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        MessageModel usersModels = new MessageModel(
                                snapshot.child("name").getValue().toString(),
                                snapshot.child("text").getValue().toString());
                        chatModelsArrayList.add(usersModels); }
                    updateWidgetScreen(chatModelsArrayList);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
            Toast.makeText(getApplicationContext(), R.string.AddedTowidget, Toast.LENGTH_LONG).show();


        }

然后这个来更新小部件

private void updateWidgetScreen(List<MessageModel> chatModelsList) {
                String users = getString(R.string.messages_list_name);

                for (MessageModel user : chatModelsList) {

                    users = users
                            + user.getName() + ": "
                            + user.getText() + " \n";
                }
                WidgetUpdateService.startWidgetUpdate(this, users);
            }

请问有什么问题吗?有什么解决办法吗?

【问题讨论】:

    标签: android firebase-realtime-database


    【解决方案1】:

    我怀疑代码是异步执行的。您是否尝试过像这样添加空检查:

      @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        **if (snapshot != null)**
                        **{**
                        MessageModel usersModels = new MessageModel(
                                snapshot.child("name").getValue().toString(),
                                snapshot.child("text").getValue().toString());
                        chatModelsArrayList.add(usersModels); }
                    updateWidgetScreen(chatModelsArrayList);
                        **}**
                }
    

    【讨论】:

    • 那么可能传入onDataChange()的DataSnapshot为null。为它添加一个空检查。
    【解决方案2】:

    要解决这个问题,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference messagesRef = rootRef.child("messages");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<MessageModel> chatModelsArrayList = new ArrayList<>();
    
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                MessageModel messageModel = ds.getValue(MessageModel.class);
                chatModelsArrayList.add(messageModel );
                Log.d("TAG", messageModel.getName() + " / " + messageModel.getText());
            }
    
            //Call method to update widget
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    messagesRef.addListenerForSingleValueEvent(valueEventListener);
    

    logcat 中的输出将是:

    Amr Kamal / fsafsfa
    Amr Kamal / hii
    //And so on
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多