【问题标题】:java.lang.RuntimeException: Unable to start activity ComponentInfo - FirebaseListAdapter null objectjava.lang.RuntimeException:无法启动活动 ComponentInfo - FirebaseListAdapter 空对象
【发布时间】:2019-01-09 23:38:00
【问题描述】:

我想与 firebase 数据库进行公开聊天以通过大学的课程。我有问题,因为我学习了如何写这个并且我在 youtube 上观看了教程。我找到了项目,我做到了,但是 firebase 用 FirebaseListAdapter 改变了一些东西。为此,我更改了代码。

目前我有这个:

我知道(可能)发生了什么,但我需要知道如何解决它。

1) ActivityChat 基于互联网上的教程。

public class ActivityChat extends AppCompatActivity {
    private static int SIGN_IN_REQUEST_CODE = 1;
    private FirebaseListAdapter<ChatMsg> adapter;
    Query query = FirebaseDatabase.getInstance().getReference().child("Chats").limitToLast(50);

    FirebaseListOptions<ChatMsg> options = new FirebaseListOptions.Builder<ChatMsg>()
            .setQuery(query, ChatMsg.class)
            .setLayout(R.layout.activity_chat)
            .build();
    EditText input;
    RelativeLayout chat;
    FloatingActionButton fab;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == SIGN_IN_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(getApplicationContext(), "Pomyślnie zalogowany!", Toast.LENGTH_SHORT).show();

            } else {
                Toast.makeText(getApplicationContext(), "Nie można zalogować się. Spróbuj później.", Toast.LENGTH_SHORT).show();
            }

        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        input = (EditText) findViewById(R.id.input);
        chat = (RelativeLayout) findViewById(R.id.activity_chat);
        fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseDatabase.getInstance().getReference("Chats").push().setValue(new ChatMsg(input.getText().toString(),
                        FirebaseAuth.getInstance().getCurrentUser().getEmail()));
                input.setText("");
                input.requestFocus();
                displayChatMessage();
            }

        });


        if (FirebaseAuth.getInstance().getCurrentUser() == null) {
            startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().build(), SIGN_IN_REQUEST_CODE);
        } else {
            Toast.makeText(getApplicationContext(), "Witaj: " + FirebaseAuth.getInstance().getCurrentUser().getEmail(), Toast.LENGTH_SHORT).show();
        }


    }

    private void displayChatMessage() {
        ListView listMessage = (ListView) findViewById(R.id.list_of_message);
        adapter = new FirebaseListAdapter<ChatMsg>(options) {
            @Override
            protected void populateView(@NonNull View v, @NonNull ChatMsg model, int position) {
                TextView messageText, messageUser, messageTime;
                messageText = (TextView) v.findViewById(R.id.message_text);
                messageUser = (TextView) v.findViewById(R.id.message_user);
                messageTime = (TextView) v.findViewById(R.id.message_time);

                messageText.setText(model.getMessageText());
                messageUser.setText(model.getMessageUser());
                messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)", model.getMessageTime()));
            }
        };
        listMessage.setAdapter(adapter);
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }


    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

2) 当我按下按钮进入聊天时,我看到了 2 秒的活动并且我有崩溃 apk(Apk 已停止)。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.bsk69.spystreamgui, PID: 6214
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bsk69.spystreamgui/com.example.bsk69.spystreamgui.ActivityChat}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.firebase.ui.database.FirebaseListAdapter.startListening()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2763)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2824)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1546)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6351)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.firebase.ui.database.FirebaseListAdapter.startListening()' on a null object reference
        at com.example.bsk69.spystreamgui.ActivityChat.onStart(ActivityChat.java:222)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1249)
        at android.app.Activity.performStart(Activity.java:6792)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2726)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2824) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1546) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6351) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786) 
Application terminated.

【问题讨论】:

    标签: java firebase-realtime-database chat firebaseui


    【解决方案1】:

    问题是由ActivityChat.java:222 上的NullPointerException 引起的,这是您的onStart 方法的最后一行:

    @覆盖 受保护的无效 onStart() { super.onStart(); 适配器.startListening(); }

    该错误表示您在创建adapter 之前调用了startListening()。由于您只在用户单击按钮时在displayChatMessage 中创建适配器,因此您可以盲目地告诉它开始连接到onStart 中的数据库,这发生在用户单击按钮之前。

    您很可能可以在创建适配器时直接开始收听:

    private void displayChatMessage() {
        ListView listMessage = (ListView) findViewById(R.id.list_of_message);
        adapter = new FirebaseListAdapter<ChatMsg>(options) {
            ...
        };
        listMessage.setAdapter(adapter);
        adapter.startListening();
    }
    

    您还需要更改onStop,因为这可能会在用户每次单击按钮的情况下被调用。最简单的解决方法是:

    @Override
    protected void onStop() {
        super.onStop();
        if (adapter != null) {
            adapter.stopListening();
        }
    }
    

    这些空指针异常在编程中极为常见,所以我强烈推荐阅读What is a NullPointerException, and how do I fix it?

    【讨论】:

    • 谢谢我检查它,因为我学习写作。目前我回到我的第一个问题。我做了很多组合来修复它。当我写东西并按下“发送按钮”时,我崩溃了,但消息保存在数据库中。我需要在我的 listView 中查看消息:java.lang.NullPointerException:尝试调用虚拟方法'void android.widget.TextView。在 com.example.bsk69.spystreamgui.ActivityChat$2.populateView(ActivityChat. java:201)
    • 那是在另一个位置,而不是您之前的位置。如果您按照我链接的问题/答案中的步骤操作,您应该能够弄清楚null 是什么对象。您需要在调用 setText() 之前初始化该对象,类似于我在回答中为 adapter 所做的。
    • 好的,工作!我的失败在于布局。我写了activity_chat.xml,但我应该列出_item.xml。 再次感谢您的帮助!仍在工作。
    • 很高兴听到。快乐的黑客攻击!
    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2014-02-07
    • 2014-01-23
    相关资源
    最近更新 更多