Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在asynctask中完成多个进程后返回特定值?_Android_Android Asynctask_Google Cloud Firestore - Fatal编程技术网

Android 如何在asynctask中完成多个进程后返回特定值?

Android 如何在asynctask中完成多个进程后返回特定值?,android,android-asynctask,google-cloud-firestore,Android,Android Asynctask,Google Cloud Firestore,我想在asynctask的doinbackroung()方法中返回一个Arraylist,但我只想在可以确认Arraylist已填充到最完整的位置时执行此操作。我知道不可能从内部类中的外部类返回某些内容,但我当前的方法有解决方案吗 @Override protected ArrayList<PostModel> doInBackground(Void... voids) { ArrayList<PostModel> posts =

我想在asynctask的doinbackroung()方法中返回一个Arraylist,但我只想在可以确认Arraylist已填充到最完整的位置时执行此操作。我知道不可能从内部类中的外部类返回某些内容,但我当前的方法有解决方案吗

@Override
        protected ArrayList<PostModel> doInBackground(Void... voids) {

            ArrayList<PostModel> posts = new ArrayList<>();
            ValidatorVariable vv = new ValidatorVariable();
            db.collection("users").document(currentuser.getUid()).collection("Friends").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    QuerySnapshot querySnapshot = task.getResult();
                    if (querySnapshot != null) {
                        List<FriendModel> userList = querySnapshot.toObjects(FriendModel.class);
                        i = 0;
                        while (i < userList.size()) {
                            FriendModel iteratedFriendModel = userList.get(i);
                            readytogo = false;
                            db.collection("users").document(iteratedFriendModel.getUserid()).collection("posts").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                    QuerySnapshot queryDocumentSnapshots = task.getResult();

                                    if (queryDocumentSnapshots != null) {
                                        List<PostModel> postsOfIteratedFriendModel = queryDocumentSnapshots.toObjects(PostModel.class);
                                        posts.addAll(postsOfIteratedFriendModel);
                                    }
                                    readytogo = true;
                                    i++;

                                }


                            });

                            while (!readytogo) {


                            }
                        }


                    }
                }
            });

您似乎正在AsyncTask中使用异步查询。如果改用同步查询,则可以解决问题。因为您已经在后台运行此代码,所以不会挂断UI。@Rishabh Jain我认为Firestore不支持同步查询,但是如果我错了或者有其他解决方案,请纠正我。那么为什么您需要异步任务呢?云Firestore数据库客户端已经在后台线程中运行所有网络操作。这意味着所有操作都不会阻塞主线程。将其放在异步任务中不会带来任何额外的好处。请检查重复项以了解为什么会出现这种行为,以及如何使用自定义回调解决此问题。您似乎在AsyncTask中使用异步查询。如果改用同步查询,则可以解决问题。因为您已经在后台运行此代码,所以不会挂断UI。@Rishabh Jain我认为Firestore不支持同步查询,但是如果我错了或者有其他解决方案,请纠正我。那么为什么您需要异步任务呢?云Firestore数据库客户端已经在后台线程中运行所有网络操作。这意味着所有操作都不会阻塞主线程。将其放在异步任务中不会带来任何额外的好处。请检查重复项以了解为什么会出现这种行为,以及如何使用自定义回调解决此问题。
public class ValidatorVariable {
    private boolean valid;
    private ChangeListener listener;

    public boolean isValid(){
        return valid;
    }

    public void setValid(boolean valid){
        this.valid = valid;
        if (listener != null) listener.onChange();
    }

    public ChangeListener getListener(){
        return listener;
    }

    public void setListener(ChangeListener listener){
        this.listener = listener;
    }

    public interface ChangeListener {
        void onChange();
    }
}