当前位置:网站首页>七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
2022-08-03 23:56:00 【华为移动服务】
七夕情人节到了,各种App都要忙着上新,抓住互联网产品的节日热点,结合应用的类别进行活动营销。比如购物类App会在节日进行大促;旅游类App会推出各种优惠活动;短视频和拍照App会推出各种节日限定特效、专属贴纸等。
尤其是游戏类App,具有较强的社交属性,在节日热点一般都会进行版本更新,上线新皮肤新场景等,涉及到的内容很多,有时候版本更新包的资源太大,导致用户更新时等待时间长,影响运营推广和用户下载体验。这时只需要接入HMS Core Network Kit,就可大幅提升资源下载速率。
HMS Core Network Kit是一款网络基础服务套件,聚合远场网络通信优秀实践,辅以RESTful、文件上传/下载等场景化接口,为您提供简单易用、低时延、高吞吐和高安全的端云传输通道。除了可以提升文件上传/下载的速度和成功率,还可以在URL访问网络场景中提升网络访问速度,在弱网环境中可减少无效网络等待时间,且支持网络平滑迁移。
从图中可以看出,集成Network Kit后下载速度提升约40%。
HMS Core Network Kit首先在QUIC 协议上叠加自研的大文件拥塞控制算法,通过高效的并发数据流,有效提升弱网下的吞吐量;其次,智能分片针对不同机器环境设置不同分片阈值及分片数,尽可能提升下载速度;同时也支持多任务并发执行及管理,任务断点续传,提升下载成功率。适用于与新版本升级、补丁升级、新场景地图等相关资源加载、活动图片、视频下载等。
开发步骤
在进行开发之前,您需要完成必要的开发准备工作,详情可见Network开发指导文档。
SDK集成示例代码如下:
dependencies {
// 使用Network Kit的网络请求功能
implementation 'com.huawei.hms:network-embedded: 6.0.0.300'
// 使用Network Kit的文件上传/下载功能
implementation 'com.huawei.hms:filemanager: 6.0.0.300'
}
因为Network Kit使用了Java 8的新特性,如:Lambda表达式、静态接口方法等。所以Network Kit均需要为Gradle添加Java 8的环境编译约束。
在“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的getCode方法获取的返回值与静态变量Result.SUCCESS一致则文件上传任务启动成功。
Result result = upManager.start(request, callback);
// 上传任务启动是否成功,可以通过Result的getCode()方法获取的返回值是否与静态变量Result.SUCCESS一致来判断。
if (result.getCode() != Result.SUCCESS) {
Log.e(TAG, result.getMessage());
}
- 文件上传状态回调。
文件上传状态改变时,步骤4创建的FileUploadCallback对象的不同回调方法将被调用。
• 文件上传开始时,onStart方法会被调用。
• 文件上传进度改变时,onProgress方法会被调用,并可通过解析回调的Progress对象,获取上传进度。
• 文件上传任务发生异常时,onException方法会被调用。
- 验证上传结果。
文件上传成功后会回调到步骤4创建的FileUploadCallback请求回调对象的onSuccess方法。
文件下载
文件下载功能可以通过如下操作实现。详细开发过程和代码实现请参见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的getCode方法获取的返回值与静态变量Result.SUCCESS一致则文件下载任务启动成功。
Result result = downloadManager.start(getRequest, callback);
if (result.getCode() != Result.SUCCESS) {
// 当通过result获取到的值为Result.SUCCESS时,则下载任务启动成功,否则启动失败。
Log.e(TAG, “start download task failed:” + result.getMessage());
}
- 文件下载状态回调。
文件下载状态改变时,步骤4创建的FileRequestCallback请求回调对象的不同方法将被调用。
• 文件开始下载时,onStart方法会被调用。
• 文件下载进度改变时,onProgress方法会被调用,并可通过解析回调的Progress对象,获取下载进度。
• 文件下载任务发生异常时,onException方法会被调用。
- 验证下载结果。
文件下载成功后会回调到步骤4创建的FileRequestCallback请求回调对象的onSuccess方法,并可根据您设置的下载路径在手机内存中查看到您下载的文件。
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~
边栏推荐
- 射频芯片ATE测试从入门到放弃之参数测试
- 小身材有大作用——光模块基础知识(一)
- 汉字风格迁移---结合本地和全局特征学习的中文字体迁移
- Scala basics [regular expressions, framework development principles]
- FinClip, help smart TV more imagination
- 2022-08-03:以下go语言代码输出什么?A:2;B:3;C:1;D:0。 package main import “fmt“ func main() { slice := []i
- 孙宇晨:Web3.0和元宇宙将协助人类更加全面地进入网络世界
- POE交换机全方位解读(下)
- View the version number of CUDA, pytorch, etc.
- Prometheus监控Harbor(二进制版)
猜你喜欢
Creo 9.0二维草图的诊断:加亮开放端点
Three.js入门详解
射频芯片ATE测试从入门到放弃之参数测试
vscode插件设置——Golang开发环境配置
Using matlab to solve the linear optimization problem based on matlab dynamic model of learning notes _11 】 【
Pytest学习-skip/skipif
"Miscellaneous" barcode by Excel as a string
Justin Sun was invited to attend the 36氪 Yuan Universe Summit and delivered a keynote speech
Unity 截取3D图像 与 画中画PIP的实现
【深度学习】基于tensorflow的服装图像分类训练(数据集:Fashion-MNIST)
随机推荐
伦敦银最新均线分析系统怎么操作?
小身材有大作用——光模块基础知识(一)
Three.js入门详解
用栈实现队列
The world's first mass production, with the most fixed points!How does this AVP Tier1 lead?
The curl using guide
Unity intercepts 3D images and the implementation of picture-in-picture PIP
初始 List 接口
Pytest学习-skip/skipif
【杂项】通过Excel为字符串产生条码
智能管理PoE交换机
孙宇晨:Web3.0和元宇宙将协助人类更加全面地进入网络世界
The Chinese Valentine's Day event is romantically launched, don't let the Internet slow down and miss the dark time
BPF 可移植性和 CO-RE(一次编译,到处运行)
The "interaction design" battle of the smart cockpit
The super perfect layout has shortcut keys and background replacement
Shell编程之循环语句与函数
Salesforce的中国区业务可能出现新变化,传言可能正在关闭
HNUCM 您好中国
Super perfect version of the layout have shortcut, background replacement (solve the problem of opencv Chinese path)