当前位置:网站首页>七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
2022-08-03 22:46:00 【HMS Core】
七夕情人节到了,各种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 最新技术资讯~
边栏推荐
- pikachu Over permission 越权
- 直播预告 | 构建业务智联,快速拥抱财务数字化转型
- 嵌入式系统:GPIO
- 工作小计 QT打包
- 【bug】汇总Elipse项目中代码中文乱码解决方法!
- Codeup brushing notes - simple simulation
- Nine ways to teach you to read the file path in the resources directory
- 中国企业构建边缘计算解决方案的最佳实践
- PowerMockup 4.3.4::::Crack
- Network basic learning series four (network layer, data link layer and some other important protocols or technologies)
猜你喜欢
.NET6之MiniAPI(十四):跨域CORS(上)
Click the icon in Canvas App to generate PDF and save it to Dataverse
Embedded Systems: GPIO
重发布实验报告
navicat 连接 mongodb 报错[13][Unauthorized] command listDatabases requires authentication
Conditional Statements for Shell Programming
On the Qixi Festival of 2022, I will offer 7 exquisite confession codes, and at the same time teach you to quickly change the source code for your own use
云平台建设解决方案
"Digital Economy Panorama White Paper" Financial Digital User Chapter released!
win10系统下yolov5-V6.1版本的tensorrt部署细节教程及bug修改
随机推荐
【MySQL进阶】数据库与表的创建和管理
Golang Chapter 1: Getting Started
for循环练习题
Cisco ike2 IPSec配置
2022的七夕,奉上7个精美的表白代码,同时教大家快速改源码自用
[b01lers2020]Life on Mars
【开源框架】国内首个通用云计算框架,任意程序都可做成云计算。
HCIP BGP lab report
What is Adobe?
举一个 web worker 的例子
FinClip最易用的智能电视小程序
易观分析:2022年Q2中国网络零售B2C市场交易规模达23444.7亿元
113. Teach a Man how to fish - How to query the documentation and technical implementation details of any SAP UI5 control property by yourself
Summary bug 】 【 Elipse garbled solution project code in Chinese!
封装、包、访问权限修饰符、static变量
目标检测的国内外研究现状
Take an example of a web worker
HCIP BGP实验报告
授人以渔 - 如何自行查询任意 SAP UI5 控件属性的文档和技术实现细节试读版
4年工作经验,多线程间的5种通信方式都说不出来,你敢信?