Android 如何在asynctask中完成多个进程后返回特定值?
我想在asynctask的doinbackroung()方法中返回一个Arraylist,但我只想在可以确认Arraylist已填充到最完整的位置时执行此操作。我知道不可能从内部类中的外部类返回某些内容,但我当前的方法有解决方案吗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 =
@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();
}
}