Java Firebase Cloud Firestore-将文档获取到自定义对象并将其传递给另一个活动

Java Firebase Cloud Firestore-将文档获取到自定义对象并将其传递给另一个活动,java,android,firebase,android-intent,google-cloud-firestore,Java,Android,Firebase,Android Intent,Google Cloud Firestore,我正在尝试将存储在Firebase Cloud Firestore中的文档获取到我的自定义对象(动物)。我需要将此对象传递给另一个活动。我使用了intent.putextra(“类名”,obj)函数,但我无法访问为获取文档而创建的对象。这是我的密码: public void start(View view){ String id; EditText animalIdEditText = findViewById(R.id.animalIDsearch); String animalId = a

我正在尝试将存储在Firebase Cloud Firestore中的文档获取到我的自定义对象(动物)。我需要将此对象传递给另一个活动。我使用了
intent.putextra(“类名”,obj)
函数,但我无法访问为获取文档而创建的对象。这是我的密码:

public void start(View view){

String id;
EditText animalIdEditText = findViewById(R.id.animalIDsearch);
String animalId = animalIdEditText.getText().toString();
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference docRef = db.collection("Animals").document(animalId);
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        Animal animal = documentSnapshot.toObject(Animal.class); // this is where I create animal object. It doesn't let me declare it above either.
    }
});

    Intent intent = new Intent(this, searchActivity.class);
    intent.putExtra("Animal",animal); // error in this line : animal  can't be resolved
    startActivity(intent);
}
公共作废开始(视图){
字符串id;
EditText animalIdEditText=findViewById(R.id.animalideSearch);
字符串animalId=animalideditext.getText().toString();
FirebaseFirestore db=FirebaseFirestore.getInstance();
DocumentReference docRef=db.集合(“动物”).文件(animalId);
docRef.get().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(文档快照文档快照){
Animal-Animal=documentSnapshot.toObject(Animal.class);//这是我创建Animal对象的地方。它也不允许我在上面声明它。
}
});
意向意向=新意向(此为searchActivity.class);
intent.putExtra(“Animal”,Animal);//此行出错:无法解析Animal
星触觉(意向);
}

要解决此问题,您需要等待数据,要实现此目的,您需要创建如下自定义回调:

public interface MyCallback {
    void onCallback(Animal animal);
}
public void readData(MyCallback myCallback) {
    String id;
    EditText animalIdEditText = findViewById(R.id.animalIDsearch);
    String animalId = animalIdEditText.getText().toString();
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    DocumentReference docRef = db.collection("Animals").document(animalId);
    docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            Animal animal = documentSnapshot.toObject(Animal.class);
            myCallback.onCallback(animal);
        }
    });
}
readData(new MyCallback() {
    @Override
    public void onCallback(Animal animal) {
        Intent intent = new Intent(this, searchActivity.class);
        intent.putExtra("Animal", animal);
        startActivity(intent);
    }
});
然后您需要创建如下所示的方法:

public interface MyCallback {
    void onCallback(Animal animal);
}
public void readData(MyCallback myCallback) {
    String id;
    EditText animalIdEditText = findViewById(R.id.animalIDsearch);
    String animalId = animalIdEditText.getText().toString();
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    DocumentReference docRef = db.collection("Animals").document(animalId);
    docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            Animal animal = documentSnapshot.toObject(Animal.class);
            myCallback.onCallback(animal);
        }
    });
}
readData(new MyCallback() {
    @Override
    public void onCallback(Animal animal) {
        Intent intent = new Intent(this, searchActivity.class);
        intent.putExtra("Animal", animal);
        startActivity(intent);
    }
});

有关更多信息,您可以查看我在中的回答,也可以查看此

Firebase API是异步的,在访问数据时会立即返回。您需要仅通过在回调中使用获取的数据来进行设计@asls2你成功了吗?是的,谢谢你的帮助。@asls2我知道你是个初学者。假设像您这样的未来访问者会访问此帖子,他们会认为将对象传递给方法将解决
onSuccess()
method的异步行为,但事实并非如此。@asls2感谢您做了正确的事情。这也起到了作用。遗憾的是,我不能认为其中两个答案有帮助。谢谢你的详细解释。谢谢@asls2两个答案都有效,但有很大区别。如果您使用的是Levi Albuquerque的答案,那么您并没有从回调中获取
animal
对象,您只是调用一个方法并将该对象作为参数传递。您仍在回拨中。你不能在外面用它。另见道格的评论。这取决于你选择正确的答案,但在这种情况下,这是一个很大的区别。如果你认为Levi Albuquerque的答案是正确的,那就好了,但你至少可以考虑投票表决。谢谢你能解释一下第二次回调的必要性吗?@LeviAlbuquerque不是第二次回调,它是第一次回调,也是一次回调,需要在该方法之外使用该对象。查看我上面的评论。我发现您仍然不理解回调的需要,但异步调用就是这样工作的。“从当前类调用方法会容易得多”,你是对的。但是如果需要在外面?如果在外部需要,则需要回调。在该示例中,他们没有在外部使用这些值,因为不需要这些值。为什么要使用回调?在OP的代码中,他试图在外面使用
动物
对象。