3

我有以下代码应该将图像从我的 android 设备上传到我的谷歌驱动器。

  private void saveFileToDrive() {

      progressDialog = ProgressDialog.show(this, "", "Loading...");

    Thread t = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          // File's binary content
          java.io.File fileContent = new java.io.File(fileUri.getPath());
          FileContent mediaContent = new FileContent("image/jpeg", fileContent);

          // File's metadata.
          File body = new File();
          body.setTitle(fileContent.getName());
          body.setMimeType("image/jpeg");

          File file = service.files().insert(body, mediaContent).execute();
          if (file != null) {
            showToast("Photo uploaded: " + file.getTitle());

            progressDialog.dismiss();
            //startCameraIntent();
          }
        } catch (UserRecoverableAuthIOException e) {
          startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    });
    t.start();
  }

问题是上传时间太长。这很奇怪,因为图像不太大

我想如果我通过原始 Drive App 上传它,它会做得更快。

1)有没有办法让上传速度更快,同时又不损害图像质量?

2)我想使用回调,但新线程和回调的最佳做法是什么?

3)如何显示上传当前数字上传进度(到目前为止已完成 X%)

有没有现成的签名\模式可以使用?

4

1 回答 1

1

你在主线程上做这个工作吗?我建议使用带有ProgressDialog的AsyncTask ,以便在 UI 等待响应时在后台完成工作。使用可运行文件进行上传不是一个好主意。android 内置的任何后台线程都应该有性能提升。特别是因为用户会看到一个不确定的进度对话框,这比一个因不明原因而被暂停的应用程序更令人愉悦。

或者,如果您使用 Amazon S3 服务器来存储您的上传,您可能需要使用第三方库,例如Simpl3r

如果 AsyncTask 或 Simpl3r 不是您喜欢的。Intent Service是后台上传的绝佳选择,因为上传过程与您的活动完全分离。完成上传后,您可以在用户返回该活动时更新本地存储数据。

1)没有理由需要更改图像的任何内容来上传它。特别是如果它很小。

2)我建议不要回调。使用本地存储,例如数据库,您可以在上传完成后在本地更新信息。当返回到您开始上传的活动/片段时,您可以使用 AsyncTask/AsyncTaskLoader/CursorLoader 等加载此本地数据。存在许多用于更改应用程序中的实时数据的选项。

3)存在许多模式,我在这里列出了一些我最喜欢的模式。

于 2013-11-14T23:57:50.500 回答