java - java.lang.NullPointerException:火力基地
问题描述
好的,我将尝试一点一点地慢慢解释我的错误。
我有一个根据你的教程制作的移动应用程序。我看了视频并做到了。然后我纠正并改进了错误。
通过类比您的教程,完成了写问题的功能。一切似乎都运行良好,没有任何问题。一切正常..我收集了一个有效的 APK。我觉得这很酷。
我的数据库中有很多额外的东西:Testuser1、testuser2 等等。我去把它们都删了。首先在实时数据库中删除它,然后在 Firestore 中。但是,在删除时,我不小心触摸了文档中的某些消息。
现在我在一个新应用程序中遇到错误,该应用程序的工作时间早于 APK 和一周前的版本。
错误:java.lang.NullPointerException:尝试在空对象上调用虚拟方法 'com.google.firebase.database.ChildEventListener com.google.firebase.database.Query.addChildEventListener(com.google.firebase.database.ChildEventListener)'参考
firebaseRecyclerAdapter1.startListening();
我已经为这个问题苦苦挣扎了至少 2 天,我写信给许多主题社区,技术支持都没有成功。错误不在我的 java 代码中,而是在我在 Firebase 中的 misklik 中。我想在我的情况下创建一个丢失的文档。
我已经尝试过重新创建应用程序、传递 debag 等,但都无济于事。
我的数据结构是 Firebase 实时数据库:[![我的数据结构是 Firebase 实时数据库:][1]][1]
以防万一,这是我的简化活动的代码:
public class MessageActivity extends AppCompatActivity {
private static final int PICK_IMAGE = 1;
RecyclerView recyclerView;
ImageView imageView;
ImageButton sendbtn, cambtn, back;
TextView username, typingtv;
EditText messageEt;
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference rootref1, rootref2, typingref;
MessageMember messageMember;
Boolean typingchecker = false;
String receiver_name, receiver_uid, sender_uid, url;
Uri uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
url = bundle.getString("u");
receiver_name = bundle.getString("n");
receiver_uid = bundle.getString("ruid");
sender_uid = bundle.getString("suid");
} else {
Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
}
messageMember = new MessageMember();
recyclerView = findViewById(R.id.rv_message);
cambtn = findViewById(R.id.cam_sendmessage);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(MessageActivity.this));
imageView = findViewById(R.id.iv_message);
messageEt = findViewById(R.id.messageet);
sendbtn = findViewById(R.id.imageButtonsend);
username = findViewById(R.id.username_messageTv);
Picasso.get().load(url).into(imageView);
username.setText(receiver_name);
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
sender_uid = user.getUid();
if (receiver_uid != null && sender_uid != null) {
rootref1 = database.getReference("Message").child(sender_uid); //getReference("Message")
rootref2 = database.getReference("Message").child(receiver_uid); //getReference("Message")
}
}
sendbtn.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onClick(View view) {
SendMessage();
}
});
cambtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, PICK_IMAGE);
}
});
messageEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override
public void afterTextChanged(Editable editable) { }
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE || resultCode == RESULT_OK ||
data != null || data.getData() != null) {
uri = data.getData();
String url = uri.toString();
Intent intent = new Intent(MessageActivity.this, SendImage.class);
intent.putExtra("u", url);
intent.putExtra("n", receiver_name);
intent.putExtra("ruid", receiver_uid);
intent.putExtra("suid", sender_uid);
startActivity(intent);
} else {
Toast.makeText(this, "no file selected", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onStart() {
super.onStart();
if (rootref1 != null) {
FirebaseRecyclerOptions<MessageMember> options1 =
new FirebaseRecyclerOptions.Builder<MessageMember>()
.setQuery(rootref1, MessageMember.class)
.build();
FirebaseRecyclerAdapter<MessageMember, MessageViewHolder> firebaseRecyclerAdapter1 =
new FirebaseRecyclerAdapter<MessageMember, MessageViewHolder>(options1) {
@Override
protected void onBindViewHolder(@NonNull MessageViewHolder holder, int position, @NonNull MessageMember model) {
holder.Setmessage(getApplication(), model.getMessage(), model.getTime(), model.getDate(), model.getType(),
model.getSenderuid(), model.getReceiveruid(), model.getSendername(), model.getAudio(), model.getImage());
}
@NonNull
@Override
public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.message_layout, parent, false);
return new MessageViewHolder(view);
}
};
firebaseRecyclerAdapter1.startListening();
recyclerView.setAdapter(firebaseRecyclerAdapter1);
}
}
@RequiresApi(api = Build.VERSION_CODES.N)
private void SendMessage() {
String message = messageEt.getText().toString();
Calendar cdate = Calendar.getInstance();
SimpleDateFormat currentdate = new SimpleDateFormat("dd-MMMM-yyyy");
final String savedate = currentdate.format(cdate.getTime());
Calendar ctime = Calendar.getInstance();
SimpleDateFormat currenttime = new SimpleDateFormat("HH:mm:ss");
final String savetime = currenttime.format(ctime.getTime());
String time = savedate + ":" + savetime;
if (message.isEmpty()) {
Toast.makeText(this, "Unable to send empty message", Toast.LENGTH_SHORT).show();
} else {
messageMember.setDate(savedate);
messageMember.setTime(savetime);
messageMember.setMessage(message);
messageMember.setReceiveruid(receiver_uid);
messageMember.setSenderuid(sender_uid);
messageMember.setType("t");
String id = rootref1.push().getKey();
rootref1.child(id).setValue(messageMember);
String id1 = rootref2.push().getKey();
rootref2.child(id1).setValue(messageMember);
messageEt.setText("");
}
}
}
解决方案
解决了。解决了这个问题后,我为有类似问题的人准备了几个答案。在撰写答案时,我的解决方案已经运行了超过 2 周。
1是最简单的,它可以工作。实时删除 Firebase 数据库。再次创建 JSON 文件并将其再次附加到应用程序。它帮助了我,但只是暂时的。
2-执行彻底的调试,特别是检查到 Firebase 的数据传输。从用户那里获取信息。在 FB 中获取信息
推荐阅读
- ios - Firebase 消息 - 卸载不会阻止通知
- c# - 基于操作系统的不同 NuGet 包
- html - 引导填充面板到行底部
- c# - 如何强制在 .NET Core DI 中创建类的实例?
- docker - 查找 Docker 容器可以从容器内访问多少 CPU
- apache-spark - LoadIncrementalHFiles 不适用于 Hbase 批量加载。扫描返回 0 行
- mysql - 每个组的查询最大 n 具有不同的问题
- java - 两个提交按钮来做两件不同的事情
- android - 在菜单中的抽屉布局选项中包含相对布局后不响应点击
- python - 无论 matplotlib 中箭头的角度如何,使箭头形状对称