java.lang.RuntimeException: 无法启动 activity ComponentInfo - FirebaseListAdapter 空对象
java.lang.RuntimeException: Unable to start activity ComponentInfo - FirebaseListAdapter null object
我想 public 与 firebase 数据库聊天以通过 类 大学考试。我有问题,因为我学习了如何编写这个并且我在 youtube 上观看了教程。我找到了项目并且我找到了,但是 firebase 通过 FirebaseListAdapter 改变了一些东西。为此,我更改了代码。
目前我有这个:
我知道发生了什么(可能),但我需要知道如何修复它。
1) ActivityChat 基于 Internet 上的教程。
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) 当我按下按钮进入聊天时,我看到 activity 持续 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.
问题是由 ActivityChat.java:222
上的 NullPointerException
引起的,这是您 onStart
方法的最后一行:
@Override
受保护的 void onStart() {
super.onStart();
adapter.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?。
我想 public 与 firebase 数据库聊天以通过 类 大学考试。我有问题,因为我学习了如何编写这个并且我在 youtube 上观看了教程。我找到了项目并且我找到了,但是 firebase 通过 FirebaseListAdapter 改变了一些东西。为此,我更改了代码。
目前我有这个:
我知道发生了什么(可能),但我需要知道如何修复它。
1) ActivityChat 基于 Internet 上的教程。
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) 当我按下按钮进入聊天时,我看到 activity 持续 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.
问题是由 ActivityChat.java:222
上的 NullPointerException
引起的,这是您 onStart
方法的最后一行:
@Override 受保护的 void onStart() { super.onStart(); adapter.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?。