Android 已弃用 Tasks.call - 替换

Dar*_*ony 2 android android-asynctask google-drive-api

在我的 Android 应用程序中,我可以选择将数据库备份到 Google Drive。为此,我正在使用 DriveServiceHelper 类,但我刚刚注意到,在 Android 11 中,Task.call 已被弃用。

      public Task<FileList> queryFiles() {
    return Tasks.call(mExecutor, () ->
            mDriveService.files().list().setSpaces("drive").execute());
}
Run Code Online (Sandbox Code Playgroud)

从我的 BackupActivity 然后我queryFilesbackup方法调用:

  public void backup(View v) {
        driveServiceHelper.queryFiles()
                .addOnSuccessListener(fileList -> {
                  // another code
                })
                .addOnFailureListener(e -> showMsgSnack(getString(R.string.uploaderror)));
Run Code Online (Sandbox Code Playgroud)

我没有找到任何解决方案来处理这个问题以避免该类的完全返工。

我尝试过的:

我尝试替换为可运行的,也可调用的,但它不起作用,因为预期返回任务,而不是文件列表。

我也尝试使用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();
    
}
Run Code Online (Sandbox Code Playgroud)

但返回值不适用于 void 类型的方法。

Dar*_*ony 5

好的,经过几个小时的测试,我尝试了这个解决方案,现在似乎可以工作:(使用 executorService,并且在 Handler 中需要一个 Looper。)

public Task<FileList> queryFiles() {
    final TaskCompletionSource<FileList> tcs = new TaskCompletionSource<FileList>();
    ExecutorService service = Executors.newFixedThreadPool(1);

    service.execute(
            new Runnable() {
                @Override
                public void run() {

                    FileList result = null;
                    try {
                        result = mDriveService.files().list().setSpaces("drive").execute();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    FileList finalResult = result;
                    new Handler(Looper.getMainLooper()).postDelayed(() -> tcs.setResult(finalResult), 1000);

                }
            });

    return tcs.getTask();

    }
Run Code Online (Sandbox Code Playgroud)