我有以下代码,应该将图像从我的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%)
是否有任何现成的签名\模式可供使用?
答案 0 :(得分:1)
你在主线程上做这项工作吗?我建议使用带有AsyncTask的ProgressDialog,以便在用户界面等待响应时在后台完成工作。使用runnables进行上传不是一个好主意。内置到android中的任何后台线程都应该具有性能提升。特别是因为用户会看到一个不确定的进度对话框,这个对话框比没有明显原因的应用程序更令人满意。
或者,如果您使用Amazon S3服务器存储上传内容,则可能需要使用第三方库,如Simpl3r。
如果AsyncTask或Simpl3r不是你的一杯茶。 Intent Service是后台上传的绝佳选择,因为上传过程与您的活动完全分离。完成上传后,您可以更新本地存储数据,以便用户返回该活动。
1)您没有理由需要更改图像的任何内容以上传它。特别是如果它很小。
2)我建议不要回调。使用本地存储(例如数据库),然后您可以在上载完成后在本地更新信息。当您返回活动/片段开始上传时,您可以使用AsyncTask / AsyncTaskLoader / CursorLoader等加载此本地数据。许多选项可用于更改应用中的实时数据。
3)存在许多模式,我在这里列出了我最喜欢的一些模式。