Android 已弃用 Tasks.call - 替换

标签 android android-asynctask google-drive-api

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

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

从我的 BackupActivity 然后我从 backup 方法调用 queryFiles:

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

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

我尝试了什么:

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

我还尝试使用 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 类型的方法。

最佳答案

好的,经过数小时的测试后,我尝试了这个解决方案,目前看来这很有效:(使用 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();

    }

关于Android 已弃用 Tasks.call - 替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69933562/

相关文章:

android - 刷新 ViewPager fragment 无法正常工作

javascript - 如何在序列异步函数中处理数组

android - 如果 FirebaseDatabase.getInstance().goOnline() 在我的应用程序中多次调用,它是否会打开多个连接实例?

java - Java 中 JSONObject 的替代品

用于通话声音流操作的 Android API

android - Android应用程式当机。将JSON数据放入Listview

java - 如何在 Android Studio 中将 ImageView 转换为字节数组?

java - ProgressBar - 不在 AsyncTask 中更新

google-drive-api - 在 Google Drive API 中列出事件 channel

python-3.x - 在 python 的谷歌驱动器中设置 pdf 导出选项