我有以下代码,应该将图像从我的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%)
是否有任何可用的签名\\模式可以使用?
您是否正在主线程上执行此工作? 我建议将AsyncTask与ProgressDialog一起使用,以便在UI等待响应时在后台完成工作。 使用可运行对象进行上传不是一个好主意。 android内置的任何后台线程都应该提高性能。 尤其是因为用户将看到不确定的进度对话框,该对话框比不明原因不明的应用程序更令人愉悦。
另外,如果您使用的是Amazon S3服务器来存储您的上传内容,则可能需要使用Simpl3r之类的第三方库。
如果您不是AsyncTask或Simpl3r的人,那就不要喝茶了。 意向服务是后台上传的绝佳选择,因为上传过程与您的活动完全脱钩。 上传完成后,您可以为用户返回该活动时更新本地存储数据。
1)没有理由您不需要更改任何有关图像的上传。 特别是如果它很小。
2)我不建议回调。 使用本地存储,例如数据库,上传完成后,您可以在本地更新信息。 返回开始上传的活动/片段时,可以使用AsyncTask / AsyncTaskLoader / CursorLoader等加载此本地数据。存在许多用于更改应用程序中实时数据的选项。
3)存在许多模式,我在这里列出了一些我的最爱。