【发布时间】:2021-12-24 05:59:34
【问题描述】:
在我的 android 应用程序中,我可以选择将数据库备份到 Google Drive。为此,我正在使用 DriveServiceHelper 类,但我刚刚注意到,在 Android 11 中,Task.call 已被弃用。
public Task<FileList> queryFiles() {
return Tasks.call(mExecutor, () ->
mDriveService.files().list().setSpaces("drive").execute());
}
然后我从我的 BackupActivity 调用 queryFiles 从 backup 方法:
public void backup(View v) {
driveServiceHelper.queryFiles()
.addOnSuccessListener(fileList -> {
// another code
})
.addOnFailureListener(e -> showMsgSnack(getString(R.string.uploaderror)));
我没有找到任何解决方案来避免该类的完全返工。
我尝试了什么:
我尝试用 runnable 替换,也可以调用,但它不起作用,因为预期返回的是 Task,而不是 Filelist。
我也尝试使用TaskCompletionSource:
public Task<FileList> queryFiles(int delay) throws IOException, ExecutionException, InterruptedException {
new Thread(
new Runnable() {
@Override
public void run() {
TaskCompletionSource<FileList> taskCompletionSource = new TaskCompletionSource<>();
FileList result = null;
try {
result = mDriveService.files().list().setSpaces("drive").execute();
} catch (IOException e) {
e.printStackTrace();
}
FileList finalResult = result;
new Handler().postDelayed(() -> taskCompletionSource.setResult(finalResult), delay);
return taskCompletionSource.getTask();
}
}).start();
}
但返回不是来自 void 类型的方法。
【问题讨论】:
-
@Shark 你能帮忙举个例子吗,在我的问题中,我添加了我对 TaskCompletionSource 的尝试,但它不能从主线程调用。
-
那么你为什么不把它包装在一个 Runnable 中,然后等待它的未来呢?但这也会阻塞你的主线程......你应该开始在后台线程上执行这些方法。
-
好吧,我也用runnable试过了,但是从runnable我不能返回任务,因为我想Task应该会返回,因为我从另一个类driveServiceHelper.queryFiles() .addOnSuccessListener (fileList -> {...我真的很难完成这几个星期,请您发布一些我可以用于我的案例的示例吗?
标签: android android-asynctask google-drive-api