在任务列表中传递变量

时间:2018-08-21 17:08:25

标签: android google-play-services google-drive-android-api android-task

我正在编写一个将数据保存在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);

这也不是很优雅,但这是我目前拥有的最好方法...

0 个答案:

没有答案