当前位置:网站首页>七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
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_8
targetCompatibility 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() {
@Override
public BodyRequest onStart(BodyRequest request) {
// 文件上传开始时回调此方法。
Log.i(TAG, "onStart:" + request);
return request;
}
@Override
public void onProgress(BodyRequest request, Progress progress) {
// 文件上传进度变化时回调到此方法。
Log.i(TAG, "onProgress:" + progress);
}
@Override
public void onSuccess(Response<BodyRequest, String, Closeable> response) {
// 文件上传成功时回调此方法。
Log.i(TAG, "onSuccess:" + response.getContent());
}
@Override
public 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() {
@Override
public GetRequest onStart(GetRequest request) {
// 文件下载开始时回调此方法。
Log.i(TAG, "activity new onStart:" + request);
return request;
}
@Override
public void onProgress(GetRequest request, Progress progress) {
// 文件下载进度变化时回调此方法。
Log.i(TAG, "onProgress:" + progress);
}
@Override
public void onSuccess(Response<GetRequest, File, Closeable> response) {
// 文件下载成功时回调到此方法。
String filePath = "";
if (response.getContent() != null) {
filePath = response.getContent().getAbsolutePath();
}
Log.i(TAG, "onSuccess:" + filePath);
}
@Override
public 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 最新技术资讯~
边栏推荐
- The principle and use of AOSP CameraLatencyHistogram
- SRE运维解密-什么是SRE:DevOps模型的具体实践!
- The curl using guide
- Jmeter-断言
- ts用法大全
- Click the icon in Canvas App to generate PDF and save it to Dataverse
- P1449 后缀表达式
- With the rise of concepts such as metaverse and web3.0, many digital forms such as digital people and digital scenes have begun to appear.
- Go编译原理系列7(Go源码调试)
- HNUCM 您好中国
猜你喜欢
In V8 how arrays (with source code, picture and text easier to understand)
jav一键生成数据库文档
Jar a key generation document database
Unity 截取3D图像 与 画中画PIP的实现
电子邮件安全或面临新威胁!
vscode插件设置——Golang开发环境配置
【OpenCV图像处理】 图像拼接技术
The principle and use of AOSP CameraLatencyHistogram
禾匠编译错误记录
Zilliz 2023 Fall Campus Recruitment Officially Launched!
随机推荐
ML之yellowbrick:基于titanic泰坦尼克是否获救二分类预测数据集利用yellowbrick对LoR逻辑回归模型实现可解释性(阈值图)案例
Prometheus监控Harbor(二进制版)
Zilliz 2023 Fall Campus Recruitment Officially Launched!
Redis persistence method
IELTS essay writing template
In V8 how arrays (with source code, picture and text easier to understand)
初始 List 接口
Interpretation of ML: A case of global interpretation/local interpretation of EBC model interpretability based on titanic titanic rescued binary prediction data set using interpret
SolidEdge ST8安装教程
"Digital Economy Panorama White Paper" Financial Digital User Chapter released!
Scala基础【正则表达式、框架式开发原则】
Republish the lab report
LeetCode 0155. 最小栈
详谈RDMA技术原理和三种实现方式
rosbridge-WSL2 && carla-win11
创建函数报错,提示DECLARE定义语法问题
Pytest学习-skip/skipif
Software testing is seriously involution, how to improve your competitiveness?
Unity 截取3D图像 与 画中画PIP的实现
Creo 9.0二维草图的诊断:加亮开放端点