首页 > 解决方案 > 一个接一个地执行回调

问题描述

我是在 Android Java 中进行异步编程的新手。我想知道是否有办法在初始回调函数完成后运行另一个回调。现在,我认为它们是并行运行的,即使第二个依赖于第一个。

第一次回调:

// GETTING USER
    private interface FirestoreUserCallback {
        void onCallback (User myUser);
    }

    private void getUser(final FirestoreUserCallback firestoreCallback) {
        Task<DocumentSnapshot> task = fStore.collection("users").document(fAuth.getCurrentUser().getUid()).get();
        task.addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                user = documentSnapshot.toObject(User.class);
                firestoreCallback.onCallback(user);
                Log.d(TAG, "user created");
            }
        });
        task.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "user creation failed");
            }
        });
    }

第二次回调:

// GETTING ALL DOCUMENTS
    private interface FirestoreDocumentCallback {
        void onCallback (List<TableEntries> myEntries);
    }

    private void getDocuments (final FirestoreDocumentCallback firestoreDocumentCallback) {
        fStore.collection("result")
                .document(Integer.toString(user.getCompanyNumber())) // need to use User object returned from the first Callback
                .collection("SAM").get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        List<TableEntries> results = new ArrayList<>();
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                // add objects to results ArrayList ...
                                Log.d(TAG, document.getId() + " => " + document.getData());
                            }
                            firestoreDocumentCallback.onCallback(results);
                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }
                });
    }

创建:

getUser(new FirestoreUserCallback () {
    @Override
    public void onCallback(User myUser) {
        user = myUser;
    }
});

getDocuments(new FirestoreDocumentCallback() {
    @Override
    public void onCallback(List<TableEntries> myEntries) {
        entries = myEntries;
    }
});

getDocuments() 依赖于从第一个回调中获得其值的用户变量。我收到此错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference

标签: javaandroidfirebaseasynchronousgoogle-cloud-firestore

解决方案


回调看起来不错。您只需要在访问它之前检查您的值是否为空。只需添加一个空检查

 if(doubleValue!=null)

推荐阅读