我正在编写一个将数据保存在Google云端硬盘上的Android应用(可能以后再保存在Dropbox上)。我希望应用程序写入的文件在云端硬盘的网络界面上对用户可见,因此我使用SCOPE_FILE
。在配置时,该应用程序必须检查其文件夹是否在云端硬盘上已经存在,如果不存在则创建它,因此我编写了以下Tasks
链:
getDriveResourceClient()
.getRootFolder()
.continueWithTask(task -> {
DriveFolder rootFolder = task.getResult();
Query query = new Query.Builder()
.addFilter(Filters.eq(SearchableField.TITLE, MAIN_FOLDER_TITLE))
.build();
return getDriveResourceClient().queryChildren(rootFolder, query);
})
.continueWithTask(task -> {
MetadataBuffer buffer = task.getResult();
if (buffer.getCount() == 0) {
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle(MAIN_FOLDER_TITLE)
.setMimeType(DriveFolder.MIME_TYPE)
.build();
return getDriveResourceClient().createFolder(rootFolder, changeSet);
}
})
.addOnSuccessListener(...
因此,我有一个隐含在Task
中的第一个getRootFolder()
,它获取根文件夹并将其传递给第二个Task
,以获取与给定名称匹配的资源列表。但是第三个Task
再次需要根文件夹,而我不知道该如何传递它。我想我可能会再次打电话给getRootFolder()
,但这似乎不是很优雅。我可以在rootFolder
中序列化Bundle
,但是在网络资源上似乎不是一个好主意。当然,我不能将其保存到类变量中,因为我位于lambda中。
我可以在哪里保存变量?我真的需要打两次getRootFolder()
吗?
编辑:这是另一种可能的方法,其灵感来自回忆我前一段时间在StackOverFlow上阅读的一篇文章:
Map<String,Object> params = new HashMap<String,Object>() ;
getDriveResourceClient()
.getRootFolder()
.continueWithTask(task -> {
DriveFolder rootFolder = task.getResult();
params.put("rootFolder", rootFolder);
...
return getDriveResourceClient().createFolder((DriveFolder) params.get("rootFolder"), changeSet);
这也不是很优雅,但这是我目前拥有的最好方法...