Android Studio中使用getExtra获取变量返回null问题求助
Android开发问题:Firebase获取变量后通过Intent传递返回null
问题现象
从Firebase读取变量时日志输出正常,但通过Intent.putExtra将变量传递至TaskDetail Activity后,使用getExtra获取变量返回null。
点击事件代码
holder.setItemClickListener(new TaskViewHolder.ItemClickListener() { @Override public void onClick(View view, int position, boolean isLongClick) { Intent intent = new Intent(context, TaskDetail.class); FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference databaseReference = database.getReference("Users"); databaseReference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()) .child("task") .orderByChild("id") .equalTo(taskList.get(position).getId()) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot ds: snapshot.getChildren()){ TaskModel task = ds.getValue(TaskModel.class); Log.d("TEST", "value: "+ task.getTask()); intent.putExtra("task", task.getTask().toString()); intent.putExtra("id", task.getId()); intent.putExtra("impo", task.getImpo()); intent.putExtra("done", task.getDone()); Log.d("TEST", "value: "+ ds.child("task").getValue()); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); context.startActivity(intent); } });
TaskDetail Activity代码
super.onCreate(savedInstanceState); setContentView(R.layout.activity_task_detail); Intent intent = getIntent(); String task = intent.getStringExtra("task"); int id = intent.getIntExtra("id",0); int done = intent.getIntExtra("done",0); int impo = intent.getIntExtra("impo",0); btnSave = findViewById(R.id.btnSaveEdit); txtTask = findViewById(R.id.txtTask); btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("TEST-ID", "task"+task); } });
日志截图

错误原因
Firebase的addListenerForSingleValueEvent是异步执行的方法,代码中在添加监听后立刻调用context.startActivity(intent),此时onDataChange回调还未执行,Intent中并未被塞入任何数据,因此跳转至TaskDetail后获取到的都是默认值或null。
解决方案
将启动Activity的代码context.startActivity(intent)移至onDataChange回调内部,确保数据成功写入Intent后再启动目标页面。如果是按id查询,结果通常只有一条数据,可以优化循环逻辑避免重复添加:
修改后的点击事件代码
holder.setItemClickListener(new TaskViewHolder.ItemClickListener() { @Override public void onClick(View view, int position, boolean isLongClick) { Intent intent = new Intent(context, TaskDetail.class); FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference databaseReference = database.getReference("Users"); databaseReference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()) .child("task") .orderByChild("id") .equalTo(taskList.get(position).getId()) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (!snapshot.exists()) { return; // 无数据时直接返回 } // 按id查询通常只有一条数据,无需循环 DataSnapshot ds = snapshot.getChildren().iterator().next(); TaskModel task = ds.getValue(TaskModel.class); if (task == null) { return; } Log.d("TEST", "value: "+ task.getTask()); intent.putExtra("task", task.getTask().toString()); intent.putExtra("id", task.getId()); intent.putExtra("impo", task.getImpo()); intent.putExtra("done", task.getDone()); Log.d("TEST", "value: "+ ds.child("task").getValue()); // 数据写入Intent后再启动Activity context.startActivity(intent); } @Override public void onCancelled(@NonNull DatabaseError error) { // 可添加错误提示逻辑 } }); } });
额外优化建议
如果TaskModel需要频繁传递,可以让TaskModel实现Parcelable接口,直接通过intent.putExtra("task", task)传递整个对象,简化代码逻辑。
内容的提问来源于stack exchange,提问作者cx330
相关产品推荐
相关产品推荐

