情人节到了,各种App忙着上新。抓住互联网产品的节日热点,结合APP品类进行事件营销。例如,购物类应用在节日期间会有大促销;旅游APP将推出各种优惠;短视频和照片应用将推出各种节日特效和专属贴纸。尤其是游戏类应用,具有很强的社交属性。版本更新一般在节日热点进行,新皮肤新场景上线等,涉及的内容非常多。有时版本更新包资源过大,导致用户等待更新。时间长了会影响运营推广和用户下载体验。此时只需要连接HMSCoreNetworkKit即可大幅提升资源下载速度。HMSCoreNetworkKit是一个基础网络服务套件,融合了远场网络通信的优秀实践,辅以RESTful、文件上传/下载等场景化接口,为您提供易用、低时延、高-吞吐量大、安全性高的终端云传输通道。除了提升文件上传/下载的速度和成功率,还可以提升URL访问网络场景下的网络访问速度,减少弱网环境下的无效网络等待时间,支持网络平滑迁移。从图中可以看出,集成NetworkKit后,下载速度提升约40%。HMSCoreNetworkKit首次将自研的大文件拥塞控制算法叠加在QUIC协议上,通过高效的并发数据流,有效提升弱网下的吞吐量;其次,智能分片设置不同的分片阈值和分片数量,尽可能提高下载速度;支持多任务并发执行和管理,中断任务续传,提高下载成功率。适用于新版本升级、补丁升级、新场景地图等相关资源加载、活动图片、视频下载等。开发步骤开发前,您需要完成必要的开发准备工作。详见网络开发指导文件。SDK集成示例代码如下:dependencies{//使用NetworkKit的网络请求功能实现'com.huawei.hms:network-embedded:6.0.0.300'//使用NetworkKit的文件上传/下载功能实现'com.huawei.hms:filemanager:6.0.0.300'}因为NetworkKit使用了Java8的新特性,比如:Lambda表达式、静态接口方法等。因此,NetworkKit需要为Gradle添加Java8环境编译约束。在“compileOptions”中添加如下编译配置。android{compileOptions{sourceCompatibilityJavaVersion.VERSION_1_8targetCompatibilityJavaVersion.VERSION_1_8}}示例代码文件上传文件上传功能可以通过以下操作实现。详细的开发流程和代码实现请参考codelab(文件上传/下载集成)和示例代码。当适配版本为Android6.0(APILevel23)及以上时,需要动态申请读写手机存储的权限(每个申请只需成功申请一次)。如果(Build.VERSION.SDK_INT>=23){如果(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED||checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED{Manifest.permission.WRITE_EXTERNAL_STORAGE},L_STORAGE1000);requestPermissions(newString[]{Manifest.permission.READ_EXTERNAL_STORAGE},1001);}}初始化全局上传管理类UploadManager。UploadManagerupManager=(UploadManager)newUploadManager.Builder("uploadManager").build(context);构造请求正文对象。我们以上传文件file1和file2为例。MaphttpHeader=newHashMap<>();httpHeader.put("header1","value1");MaphttpParams=newHashMap<>();httpParams.put("param1","value1");//替换为你需要上传的目的地址。StringnormalUrl="https://path/upload";//替换为你需要上传的文件地址。StringfilePath1=context.getString(R.string.filepath1);//替换为你需要上传的文件地址。StringfilePath2=context.getString(R.string.filepath2);//构造一个POST请求对象。尝试{BodyRequestrequest=UploadManager.newPostRequestBuilder().url(normalUrl).fileParams("file1",newFileEntity(Uri.fromFile(newFile(filePath1)))).fileParams("file2",newFileEntity(Uri.fromFile(newFile(filePath2)))).params(httpParams).headers(httpHeader).build();}catch(Exceptionexception){Log.e(TAG,"exception:"+exception.getMessage());}创建一个FileUploadCallback请求回调类。FileUploadCallbackcallback=newFileUploadCallback(){@OverridepublicBodyRequestonStart(BodyRequestrequest){//文件上传开始时回调此方法。Log.i(TAG,"onStart:"+request);退货申请;}@OverridepublicvoidonProgress(BodyRequestrequest,Progressprogress){//文件上传进度变化时回调该方法。Log.i(TAG,"onProgress:"+进度);}@OverridepublicvoidonSuccess(Responseresponse){//文件上传成功时回调该方法。Log.i(TAG,"onSuccess:"+response.getContent());}@OverridepublicvoidonException(BodyRequestrequest,NetworkExceptionexception,Responseresponse){//文件上传过程中网络发生异常时回调该方法,或者请求被取消时回调。if(exceptioninstanceofInterruptedException){StringerrorMsg="onExceptionforcanceled";Log.w(TAG,errorMsg);}else{StringerrorMsg="onExceptionfor:"+request.getId()+""+Log.getStackTraceString(exception);Log.e(TAG,errorMsg);}}};发送请求上传指定文件,获取是否开始上传成功。当Result的getCode方法得到的返回值与静态变量Result.SUCCESS一致时,文件上传任务启动成功。Resultresult=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(APILevel23)及以上时,需要动态申请读写手机存储的权限(每个申请只需成功申请一次)。如果(Build.VERSION.SDK_INT>=23){如果(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED||checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED{Manifest.permission.WRITE_EXTERNAL_STORAGE},L_STORAGE1000);requestPermissions(newString[]{Manifest.permission.READ_EXTERNAL_STORAGE},1001);}}初始化全局下载管理类DownloadManager。DownloadManagerdownloadManager=newDownloadManager.Builder("downloadManager").build(context);构造请求正文对象。//替换成你需要下载的资源地址。StringnormalUrl="https://gdown.baidu.com/data/wisegame/10a3a64384979a46/ee3710a3a64384979a46542316df73d4.apk";//替换成你要保存的目的地址。StringdownloadFilePath=context.getExternalCacheDir().getPath()+File.separator+"test.apk";//构造一个GET请求体对象。GetRequestgetRequest=DownloadManager.newGetRequestBuilder().filePath(downloadFilePath).url(normalUrl).build();创建一个FileRequestCallback请求回调对象。FileRequestCallbackcallback=newFileRequestCallback(){@OverridepublicGetRequestonStart(GetRequestrequest){//文件下载开始时回调此方法。Log.i(TAG,"activitynewonStart:"+request);退货申请;}@OverridepublicvoidonProgress(GetRequestrequest,Progressprogress){//当文件下载进度发生变化时回调该方法。Log.i(TAG,"onProgress:"+进度);}@OverridepublicvoidonSuccess(Responseresponse){//文件下载成功回调该方法。字符串文件路径="";if(response.getContent()!=null){filePath=response.getContent().getAbsolutePath();}Log.i(TAG,"onSuccess:"+filePath);}@OverridepublicvoidonException(GetRequestrequest,NetworkExceptionexception,Responseresponse){//当文件下载过程中出现网络异常,或者请求被挂起或取消时回调该方法。if(exceptioninstanceofInterruptedException){StringerrorMsg="onExceptionforpausedorcancelled";}Log.w(TAG,errorMsg);}else{StringerrorMsg="onExceptionfor:"+request.getId()+""+Log.getStackTraceString(异常);Log.e(TAG,errorMsg);}}};使用DownloadManager启动下载任务,查看下载任务是否启动成功。当Result的getCode方法得到的返回值与静态变量Result.SUCCESS一致时,文件下载任务启动成功。Resultresult=downloadManager.start(getRequest,callback);if(result.getCode()!=Result.SUCCESS){//当通过result获取的值为Result.SUCCESS时,下载任务启动成功,否则启动失败。Log.e(TAG,“开始下载任务失败:”+result.getMessage());}文件下载状态回调。当文件下载状态发生变化时,将调用步骤4中创建的FileRequestCallback请求回调对象的不同方法。?当文件开始下载时,将调用onStart方法。?当文件下载进度发生变化时,会调用onProgress方法,通过解析回调的Progress对象获取下载进度。?当文件下载任务发生异常时,会调用onException方法。验证下载结果。文件下载成功后,会回调到第4步创建的FileRequestCallback请求回调对象的onSuccess方法,您可以根据您设置的下载路径在手机内存中查看下载的文件。更多详情>>访问华为开发者联盟官网获取开发指导文档华为移动服务开源仓库地址:GitHub、Gitee关注我们,第一时间了解HMSCore最新技术资讯~