具体代码
生成一个Button控件。 位置:
res/layout/content_main.xml
内容:
<Button
style="?android:attr/buttonStyleSmall"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/multipart_upload"
android:id="@+id/multipart_upload" />
点击上传,选择要上传的文件。 函数实现片段:
Button multipart_upload = (Button) findViewById(R.id.multipart_upload);
multipart_upload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//为了简单化,这里只会同时运行一个断点上传的任务
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_PAUSEABLEUPLOAD_IMAGE);
}
}
);
点击上传,继续时的断点续传。函数实现片段:
点击上传:
//这里调用SDK的分片上传接口来上传
task = ossService.asyncMultiPartUpload(objectName, picturePath, getMultiPartCallback().addCallback(new Runnable() {
@Override
public void run() {
pauseTaskStatus = TASK_NONE;
multipart_resume.setEnabled(false);
multipart_pause.setEnabled(false);
task = null;
}
}}, new ProgressCallbackFactory<PauseableUploadRequest>().get());
底层对SDK的封装逻辑,可以看到是在multiPartUploadManager中的asyncUpload实现的断点续传上传
//断点上传,返回的task可以用来暂停任务
public PauseableUploadTask asyncMultiPartUpload(String object,
String localFile,
@NonNull final OSSCompletedCallback<PauseableUploadRequest, PauseableUploadResult> userCallback,
final OSSProgressCallback<PauseableUploadRequest> userProgressCallback) {
if (object.equals("")) {
Log.w("AsyncMultiPartUpload", "ObjectNull");
return null;
}
File file = new File(localFile);
if (!file.exists()) {
Log.w("AsyncMultiPartUpload", "FileNotExist");
Log.w("LocalFile", localFile);
return null;
}
Log.d("MultiPartUpload", localFile);
PauseableUploadTask task = multiPartUploadManager.asyncUpload(object, localFile, userCallback, userProgressCallback);
return task;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从您的描述来看,您正在使用Android开发环境,并且涉及到文件上传功能,特别是利用了断点续传技术来提升大文件上传的稳定性和用户体验。这里有几个关键点和建议,帮助您更好地理解和优化这段代码:
在res/layout/content_main.xml
中,您已经成功定义了一个Button控件,用于触发文件选择和上传操作。确保@string/multipart_upload
在对应的字符串资源文件(如strings.xml
)中有相应的文本定义。
通过Intent.ACTION_PICK
启动系统文件选择器,限制为图片类型,这是正确的做法。不过,请注意处理RESULT_PAUSEABLEUPLOAD_IMAGE
这个请求码,在onActivityResult
方法中获取用户选择的文件并进行后续处理。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RESULT_PAUSEABLEUPLOAD_IMAGE && resultCode == RESULT_OK && data != null) {
Uri selectedImage = data.getData();
// 这里可以将Uri转换为实际路径或直接使用,然后调用上传逻辑
}
}
您提到的ossService.asyncMultiPartUpload
方法调用展示了如何利用OSS SDK(阿里云对象存储服务的SDK)异步执行分片上传。这是一个很好的实践,因为它允许大文件被分割成多个小块上传,提高上传成功率和速度。
PauseableUploadTask task
变量用来跟踪上传任务,这使得暂停和恢复上传成为可能。确保在应用的生命周期管理中正确处理这个任务,比如在Activity或Fragment的onPause
、onResume
或onDestroy
中适当取消或恢复任务,以避免内存泄漏或不必要的网络操作。
在multiPartUploadManager.asyncUpload
方法中,确保对异常情况有充分的处理,比如文件不存在或网络问题等,这样可以提供更健壮的错误处理机制给用户。
断点续传的核心在于记录上传进度并在中断后能从上次断点继续,这通常需要依赖于OSS SDK内部维护的状态信息,比如upload ID等。确保这些状态信息在应用重启后也能被正确恢复,可能需要借助本地存储(SharedPreferences或数据库)来持久化这些数据。
您的代码片段覆盖了从UI设计到后台服务调用的关键步骤,实现了基本的文件选择和断点续传上传功能。为了进一步提升应用的稳定性和用户体验,建议关注错误处理、应用生命周期管理以及用户反馈的设计。同时,深入理解所使用的OSS SDK文档,以便充分利用其提供的高级特性和最佳实践。