You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
});

日志截图

日志显示变量为null

错误原因

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:22:08