我正在尝试从 FireBase 存储中检索文件夹名称并将它们添加到我的 ArrayList 中:
public class NewActivity extends AppCompatActivity {
List<Article> articles = new ArrayList<>()
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_themes);
FirebaseApp.initializeApp(NewActivity.this);
FirebaseDatabase database = FirebaseDatabase.getInstance();
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference reference = storage.getReference("themes");
reference.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
@Override
public void onSuccess(ListResult listResult) {
for (StorageReference prefix: listResult.getPrefixes()) {
articles.add(new Article(prefix.getName()));
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printStackTrace();
}
});
最后,在 Activity 停止运行后,我仍然有一个空的 ArrayList,没有保存任何文件夹的名称(实际上引用“主题”有几个文件夹)。我已经读过,“addOnSuccessListener 是异步的并立即返回。回调会在一段时间后调用。并且还应使用 Tasks.whenAll() 来获取数据”。但我不知道如何将它实现到我的代码中......我需要你的帮助。
您是对的,Firebase 存储操作是异步的,您提供的代码可能无法保证 articles 列表按您期望的方式填充。为了确保仅在从 Firebase 存储检索所有数据后才填充您的 articles 列表,您可以使用
Tasks.whenAll()
来处理异步调用。您可以通过以下方式修改代码来实现此目的:
public class NewActivity extends AppCompatActivity {
List<Article> articles = new ArrayList<>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_themes);
FirebaseApp.initializeApp(NewActivity.this);
FirebaseDatabase database = FirebaseDatabase.getInstance();
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference reference = storage.getReference("themes");
Task<ListResult> listTask = reference.listAll();
listTask.addOnSuccessListener(new OnSuccessListener<ListResult>() {
@Override
public void onSuccess(ListResult listResult) {
List<Task<Void>> tasks = new ArrayList<>();
for (StorageReference prefix : listResult.getPrefixes()) {
Task<String> nameTask = prefix.getName();
// Create a new task for each folder name retrieval
tasks.add(nameTask.onSuccessTask(new OnSuccessListener<String>() {
@Override
public void onSuccess(String name) {
articles.add(new Article(name));
return null;
}
}));
}
// Wait for all tasks to complete before proceeding
Tasks.whenAll(tasks).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// Do something with the populated 'articles' list
// This will be executed after all folder names are retrieved
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printStackTrace();
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printStackTrace();
}
});
}
}
在此代码中:
1. 我们创建一个任务列表,用于使用 nameTask 检索文件夹名称。
2. 我们使用onSuccessTask为每个文件夹名称创建一个新任务 恢复。这允许您将文件夹名称添加到文章列表中 并继续任务链。
3. 我们使用Tasks.whenAll(tasks)来等待所有任务完成, 在继续之前确保文章列表已完全填充 任何进一步的行动。
4. 现在,只有在之后,文章列表才会填充文件夹名称 所有数据已成功从 Firebase 存储中检索。