如何更快地上传到Google云端硬盘?

时间:2013-11-09 21:32:15

标签: java android callback

我有以下代码,应该将图像从我的Android设备上传到我的Google云端硬盘。

  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%)

是否有任何现成的签名\模式可供使用?

1 个答案:

答案 0 :(得分:1)

你在主线程上做这项工作吗?我建议使用带有AsyncTaskProgressDialog,以便在用户界面等待响应时在后台完成工作。使用runnables进行上传不是一个好主意。内置到android中的任何后台线程都应该具有性能提升。特别是因为用户会看到一个不确定的进度对话框,这个对话框比没有明显原因的应用程序更令人满意。

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

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

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

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

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