当前位置:网站首页>七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
2022-08-03 23:36:00 【nginx】
尤其是游戏类App,具有较强的社交属性,在节日热点一般都会进行版本更新,上线新皮肤新场景等,涉及到的内容很多,有时候版本更新包的资源太大,导致用户更新时等待时间长,影响运营推广和用户下载体验。这时只需要接入HMS Core Network Kit,就可大幅提升资源下载速率。
HMS Core Network Kit是一款网络基础服务套件,聚合远场网络通信优秀实践,辅以RESTful、文件上传/下载等场景化接口,为您提供简单易用、低时延、高吞吐和高安全的端云传输通道。除了可以提升文件上传/下载的速度和成功率,还可以在URL访问网络场景中提升网络访问速度,在弱网环境中可减少无效网络等待时间,且支持网络平滑迁移。

从图中可以看出,集成Network Kit后下载速度提升约40%。
HMS Core Network Kit首先在QUIC 协议上叠加自研的大文件拥塞控制算法,通过高效的并发数据流,有效提升弱网下的吞吐量;其次,智能分片针对不同机器环境设置不同分片阈值及分片数,尽可能提升下载速度;同时也支持多任务并发执行及管理,任务断点续传,提升下载成功率。适用于与新版本升级、补丁升级、新场景地图等相关资源加载、活动图片、视频下载等。
开发步骤
在进行开发之前,您需要完成必要的开发准备工作,详情可见Network开发指导文档。
SDK集成示例代码如下:
因为Network Kit使用了 java 8的新特性,如:Lambda表达式、静态接口方法等。所以Network Kit均需要为Gradle添加Java 8的环境编译约束。
dependencies {// 使用Network Kit的网络请求功能implementation 'com.huawei.hms:network-embedded: 6.0.0.300'// 使用Network Kit的文件上传/下载功能implementation 'com.huawei.hms:filemanager: 6.0.0.300'}
在“compileOptions”中添加如下编译配置。
示例代码
android{compileOptions{sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}}
文件上传
文件上传功能可以通过如下操作实现。详细开发过程和代码实现可以参见codelab(文件上传/下载集成)和示例代码。
- 当适配版本为Android6.0(API Level 23)及以上时,需要动态申请读写手机存储权限(每个应用只需成功申请一次)。
if (Build.VERSION.SDK_INT >= 23) {if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1000);requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);}}
- 初始化全局上传管理类UploadManager。
UploadManager upManager = (UploadManager) new UploadManager.Builder("uploadManager").build(context);
- 构造请求体对象。我们以上传文件file1和file2为例。
Map<String, String> httpHeader = new HashMap<>();httpHeader.put("header1", "value1");Map<String, String> httpParams = new HashMap<>();httpParams.put("param1", "value1");// 替换成您需要上传的目的地址。String normalUrl = "https://path/upload";// 替换成您需要上传的文件的地址。String filePath1 = context.getString(R.string.filepath1);// 替换成您需要上传的文件的地址。String filePath2 = context.getString(R.string.filepath2);// 构造POST请求对象。try{BodyRequest request = UploadManager.newPostRequestBuilder().url(normalUrl).fileParams("file1", new FileEntity(Uri.fromFile(new File(filePath1)))).fileParams("file2", new FileEntity(Uri.fromFile(new File(filePath2)))).params(httpParams).headers(httpHeader).build();}catch(Exception exception){Log.e(TAG,"exception:" + exception.getMessage());}
- 创建FileUploadCallback请求回调类。
FileUploadCallback callback = new FileUploadCallback() {@Overridepublic BodyRequest onStart(BodyRequest request) {// 文件上传开始时回调此方法。Log.i(TAG, "onStart:" + request);return request;}@Overridepublic void onProgress(BodyRequest request, Progress progress) {// 文件上传进度变化时回调到此方法。Log.i(TAG, "onProgress:" + progress);}@Overridepublic void onSuccess(Response<BodyRequest, String, Closeable> response) {// 文件上传成功时回调此方法。Log.i(TAG, "onSuccess:" + response.getContent());}@Overridepublic void onException(BodyRequest request, NetworkException exception, Response<BodyRequest, String, Closeable> response) {// 文件上传过程中网络发生异常,或请求被取消时回调此方法。if (exception instanceof InterruptedException) {String errorMsg = "onException for canceled";Log.w(TAG, errorMsg);} else {String errorMsg = "onException for:" + request.getId() + " " + Log.getStackTraceString(exception);Log.e(TAG, errorMsg);}}};
- 发送请求上传指定文件,并获取上传是否启动成功。
Result result = upManager.start(request, callback);// 上传任务启动是否成功,可以通过Result的getCode()方法获取的返回值是否与静态变量Result.SUCCESS一致来判断。if (result.getCode() != Result.SUCCESS) {Log.e(TAG, result.getMessage());}
- 文件上传状态回调。
·文件上传开始时,onStart方法会被调用。
·文件上传进度改变时,onProgress方法会被调用,并可通过解析回调的Progress对象,获取上传进度。
·文件上传任务发生异常时,onException方法会被调用。
- 验证上传结果。
文件下载
文件下载功能可以通过如下操作实现。详细开发过程和代码实现请参见codelab(文件上传/下载集成)和示例代码。
- 当适配版本为Android6.0(API Level 23)及以上时,需要动态申请读写手机存储权限(每个应用只需成功申请一次)。
if (Build.VERSION.SDK_INT >= 23) {if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1000);requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);}}
- 初始化全局下载管理类DownloadManager。
DownloadManager downloadManager = new DownloadManager.Builder("downloadManager").build(context);
- 构造请求体对象。
// 替换成您需要下载的资源地址。String normalUrl = "https://gdown.baidu.com/data/wisegame/10a3a64384979a46/ee3710a3a64384979a46542316df73d4.apk";// 替换成您想要保存的目的地址。String downloadFilePath = context.getExternalCacheDir().getPath() + File.separator + "test.apk";// 构造GET请求体对象。GetRequest getRequest = DownloadManager.newGetRequestBuilder().filePath(downloadFilePath).url(normalUrl).build();
- 创建FileRequestCallback请求回调对象。
FileRequestCallback callback = new FileRequestCallback() {@Overridepublic GetRequest onStart(GetRequest request) {// 文件下载开始时回调此方法。Log.i(TAG, "activity new onStart:" + request);return request;}@Overridepublic void onProgress(GetRequest request, Progress progress) {// 文件下载进度变化时回调此方法。Log.i(TAG, "onProgress:" + progress);}@Overridepublic void onSuccess(Response<GetRequest, File, Closeable> response) {// 文件下载成功时回调到此方法。String filePath = "";if (response.getContent() != null) {filePath = response.getContent().getAbsolutePath();}Log.i(TAG, "onSuccess:" + filePath);}@Overridepublic void onException(GetRequest request, NetworkException exception, Response<GetRequest, File, Closeable> response) {// 文件下载过程中网络发生异常,或请求被暂停、取消时回调此方法。if (exception instanceof InterruptedException) {String errorMsg = "onException for paused or canceled";Log.w(TAG, errorMsg);} else {String errorMsg = "onException for:" + request.getId() + " " + Log.getStackTraceString(exception);Log.e(TAG, errorMsg);}}};
- 使用DownloadManager启动下载任务并检验下载任务是否启动成功。
Result result = downloadManager.start(getRequest, callback);if (result.getCode() != Result.SUCCESS) {// 当通过result获取到的值为Result.SUCCESS时,则下载任务启动成功,否则启动失败。Log.e(TAG, “start download task failed:” + result.getMessage());}
- 文件下载状态回调。
·文件开始下载时,onStart方法会被调用。
·文件下载进度改变时,onProgress方法会被调用,并可通过解析回调的Progress对象,获取下载进度。
·文件下载任务发生异常时,onException方法会被调用。
- 验证下载结果。
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~
边栏推荐
- 射频芯片ATE测试从入门到放弃之参数测试
- 代码随想录笔记_动态规划_416分割等和子集
- log4j-slf4j-impl cannot be present with log4j-to-slf4j
- 【OpenCV图像处理】 图像拼接技术
- 七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
- complete binary tree problem
- Use tf.image.resize() and tf.image.resize_with_pad() to resize images
- Zilliz 2023 Fall Campus Recruitment Officially Launched!
- jav一键生成数据库文档
- 【深度学习】基于tensorflow的服装图像分类训练(数据集:Fashion-MNIST)
猜你喜欢

响应式织梦模板塑身瑜伽类网站

In V8 how arrays (with source code, picture and text easier to understand)

Creo 9.0二维草图的诊断:加亮开放端点

Creo 9.0二维草图的诊断:重叠几何

射频芯片(RFIC)的协议之5G及其调制

AOSP CameraLatencyHistogram的原理与使用

响应式织梦模板餐饮酒店类网站

Analysys Analysis: The transaction scale of China's online retail B2C market in Q2 2022 will reach 2,344.47 billion yuan

电子邮件安全或面临新威胁!

逆波兰表达式求值
随机推荐
The longest substring that cannot have repeating characters in a leetcode/substring
ML之interpret:基于titanic泰坦尼克是否获救二分类预测数据集利用interpret实现EBC模型可解释性之全局解释/局部解释案例
V8中的快慢数组(附源码、图文更易理解)
汉字风格迁移---结合本地和全局特征学习的中文字体迁移
What is memoization and what is it good for?
"Digital Economy Panorama White Paper" Financial Digital User Chapter released!
雅思大作文写作模版
Create function report error, prompting DECLARE definition syntax problem
AOSP CameraLatencyHistogram的原理与使用
Creo 9.0在草图环境中创建坐标系
国内首发可视化智能调优平台,小龙带你玩转KeenTune UI
SRE运维解密-什么是SRE:DevOps模型的具体实践!
Unity intercepts 3D images and the implementation of picture-in-picture PIP
Jmeter-参数化
射频芯片(RFIC)的协议之5G及其调制
[2022安恒夏令营] 5个小题
Code Casual Recording Notes_Dynamic Programming_416 Segmentation and Subsetting
The principle and use of AOSP CameraLatencyHistogram
详谈RDMA技术原理和三种实现方式
LeetCode 0155. 最小栈