chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解讀HarmonyOS如何實(shí)現(xiàn)一套網(wǎng)絡(luò)請(qǐng)求框架

電子工程師 ? 來(lái)源:HarmonyOS開(kāi)發(fā)者 ? 作者:裴云飛 ? 2021-05-18 11:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本期我們?yōu)榇蠹規(guī)?lái)的是開(kāi)發(fā)者裴云飛投稿的“HarmonyOS網(wǎng)絡(luò)請(qǐng)求框架實(shí)現(xiàn)”,這個(gè)網(wǎng)絡(luò)請(qǐng)求框架被命名為“蒹葭(JianJia)”。其原理是將Retrofit移植到HarmonyOS上,同時(shí)還實(shí)現(xiàn)一些Retrofit所不具備的功能。 比如:Retrofit不支持動(dòng)態(tài)替換域名。眾所周知,國(guó)內(nèi)的應(yīng)用一般都是有多個(gè)域名的,蒹葭的一大優(yōu)勢(shì)就是支持動(dòng)態(tài)替換域名。

如想了解更多內(nèi)容,可以直接復(fù)制鏈接看源碼哦:https://gitee.com/zhongte/JianJia 接下來(lái)我們將挑選幾個(gè)關(guān)鍵點(diǎn)做解釋,希望能給你的HarmonyOS開(kāi)發(fā)之旅帶來(lái)一些啟發(fā)~ 在敲代碼之前,需要大家下載安裝“Huawei DevEco Studio”,如有疑問(wèn),可參考官網(wǎng)指南。

● Huawei DevEco Studio安裝指南: https://developer.harmonyos.com/cn/docs/documentation/doc-guides/software_install-0000001053582415 為了保證順利使用,我們先來(lái)看一下使用前的一些配置,這里我們主要介紹兩個(gè)方面配置,一個(gè)是針對(duì)代碼混淆的處理,一個(gè)是添加依賴。

01

使用前的配置

1.代碼混淆處理

如果項(xiàng)目開(kāi)啟了代碼混淆,請(qǐng)?jiān)趐roguard-rules.pro添加如下代碼:

-renamesourcefileattribute SourceFile-keepattributes SourceFile,LineNumberTable-dontwarn javax.annotation.**-keepattributes Signature, InnerClasses, EnclosingMethod, Exceptions# 蒹葭-dontwarn poetry.jianjia.**-keep class poetry.jianjia.** { *; }-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations-keepclassmembers,allowshrinking,allowobfuscation interface * { @poetry.jianjia.http.* 《methods》;}

# OkHttp3-dontwarn okhttp3.logging.**-keep class okhttp3.internal.**{*;}-dontwarn okio.**

# gson-keep class sun.misc.Unsafe { *; }-keep class com.google.gson.stream.** { *; }-keepattributes *Annotation*-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}# 在示例代碼中,com.poetry.jianjia.bean這個(gè)包下面的類實(shí)現(xiàn)了Serialized接口,# 實(shí)現(xiàn)了Serialized接口的類不能被混淆,請(qǐng)把com.poetry.jianjia.bean這個(gè)包名替換成你自己的包名-keep class com.poetry.jianjia.bean.**{*;}

2.添加依賴

添加依賴就是引用類庫(kù),詳情如下:

1) 在項(xiàng)目根目錄下的build.gradle文件中添加mavenCentral()倉(cāng)庫(kù)

打開(kāi)項(xiàng)目根目錄下的build.gradle文件,在build.gradle文件的repositories閉包下面添加mavenCentral()。

buildscript { repositories { // 添加maven中央倉(cāng)庫(kù) mavenCentral() maven { url ‘https://mirrors.huaweicloud.com/repository/maven/’ } maven { url ‘https://developer.huawei.com/repo/’ } maven { url ‘http://maven.aliyun.com/nexus/content/repositories/central/’ } jcenter() } dependencies { classpath ‘com.huawei.ohos2.4.2.5’ classpath ‘com.huawei.ohos1.0.0.6’ }}

allprojects { repositories { // 添加maven中央倉(cāng)庫(kù) mavenCentral() maven { url ‘https://mirrors.huaweicloud.com/repository/maven/’ } maven { url ‘https://developer.huawei.com/repo/’ } maven { url ‘http://maven.aliyun.com/nexus/content/repositories/central/’ } jcenter() }}

2)在build.gradle文件的dependencies閉包下添加依賴

打開(kāi)entry目錄下的build.gradle文件,在build.gradle文件中的dependencies閉包下添加下面的依賴。

// 蒹葭的核心代碼implementation ‘io.gitee.zhongte1.0.1’// 數(shù)據(jù)轉(zhuǎn)換器,數(shù)據(jù)轉(zhuǎn)換器使用gson來(lái)幫我們解析json,不需要我們手動(dòng)解析jsonimplementation ‘io.gitee.zhongte1.0.1’implementation “com.google.code.gson2.8.2”// 日志攔截器,通過(guò)日志攔截器可以看到請(qǐng)求頭、請(qǐng)求體、響應(yīng)頭、響應(yīng)體implementation ‘com.squareup.okhttp33.7.0’// 如果服務(wù)端返回的json有特殊字符,比如中文的雙引號(hào),gson在解析的時(shí)候會(huì)對(duì)特殊字符進(jìn)行轉(zhuǎn)義// 這時(shí)就需要將轉(zhuǎn)義后的字符串進(jìn)行反轉(zhuǎn)義,commons-lang可以對(duì)特殊字符進(jìn)行轉(zhuǎn)義和反轉(zhuǎn)義implementation ‘commons-lang2.6’

3)在配置文件中添加以下權(quán)限

ohos.permission.INTERNET

02

用法

蒹葭與Retrofit用法相同,并且蒹葭提供一系列的注解?!白⒔狻笨梢钥醋魇菍?duì)一個(gè)類/方法的一個(gè)擴(kuò)展的模版,每個(gè)類/方法按照注解類中的規(guī)則,來(lái)為類/方法注解不同的參數(shù),在用到的地方可以得到不同的類/方法中注解的各種參數(shù)與值。在進(jìn)行網(wǎng)絡(luò)請(qǐng)求的時(shí)候,就需要用到這些注解,下文將介紹蒹葭中常用和需要注意的注解。

1.GET注解

創(chuàng)建接口,在方法里面使用GET注解,GET注解用于標(biāo)識(shí)這是一個(gè)GET請(qǐng)求,方法的返回值是Call對(duì)象,泛型是ResponseBody,其實(shí)泛型也可以是具體的實(shí)體對(duì)象,我們將在下文“16.添加數(shù)據(jù)轉(zhuǎn)換器“中詳說(shuō)。

蒹葭如何完成網(wǎng)絡(luò)請(qǐng)求?使用構(gòu)造者模式創(chuàng)建jianjia對(duì)象,baseUrl就是域名,在創(chuàng)建jianjia對(duì)象的時(shí)候就必須指定域名。

調(diào)用create方法來(lái)生成接口的實(shí)例,調(diào)用wan.getBanner().enqueue來(lái)執(zhí)行網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求成功就會(huì)回調(diào)onResponse方法,請(qǐng)求失敗就會(huì)回調(diào)onFailure方法。

public interface Wan { @GET(“banner/json”) Call《ResponseBody》 getBanner();}JianJia jianJia = new JianJia.Builder() .baseUrl(“https://www.wanandroid.com”) .build();Wan wan = jianJia.create(Wan.class);wan.getBanner().enqueue(new Callback《ResponseBody》() { @Override public void onResponse(Call《ResponseBody》 call, Response《ResponseBody》 response) { try { String json = response.body().string(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call《ResponseBody》 call, Throwable t) { LogUtils.info(“yunfei”, t.getMessage()); }});

2. BaseUrl注解

國(guó)內(nèi)的應(yīng)用一般都是有多個(gè)域名的,BaseUrl注解可以對(duì)某個(gè)接口設(shè)置單獨(dú)的域名。

public interface Wan { @BaseUrl(“https://api.apiopen.top”) @GET(“getJoke”) Call《ResponseBody》 getJoke(@QueryMap Map《String, String》 param);}

3. Path注解

Path注解在路徑中替換指定的參數(shù)值,定義下面的方法??梢钥吹轿覀兌x了一個(gè)getArticle方法,方法接收一個(gè)page參數(shù),并且我們的@GET注解中使用{page}聲明了訪問(wèn)路徑,這里你可以把{page}當(dāng)做占位符,而實(shí)際運(yùn)行中會(huì)通過(guò)@Path(“page”)所標(biāo)注的參數(shù)進(jìn)行替換。

public interface Wan {

@GET(“article/list/{page}/json”) Call《ResponseBody》 getArticle(@Path(“page”) int page);

}

4.Query注解

Query注解用于給“get請(qǐng)求”添加請(qǐng)求參數(shù),被Query注解修飾的參數(shù)類型可以是數(shù)組、集合、字符串等。

public interface Wan { @GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@Query(“k”) String k); @GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@Query(“k”) String.。。 k); @GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@Query(“k”) List《String》 k);}

5.QueryMap注解

QueryMap注解以map的形式添加查詢參數(shù),被QueryMap注解修飾的參數(shù)類型必須是Map對(duì)象。

public interface Wan {

@GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@QueryMap Map《String, String》 param);}

6.SkipCallbackExecutor注解

在HarmonyOS中,默認(rèn)將服務(wù)端的響應(yīng)回調(diào)到主線程,如果在方法上使用SkipCallbackExecutor注解,就不會(huì)將服務(wù)端的結(jié)果回調(diào)到主線程。

public interface Wan { @SkipCallbackExecutor @GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@QueryMap Map《String, String》 param);}

7.FormUrlEncoded注解和Field注解

“FormUrlEncoded注解”用于發(fā)送一個(gè)表單請(qǐng)求,使用該注解必須在方法的參數(shù)中添加Field注解,被Field注解修飾的參數(shù)類型可以是數(shù)組、集合、字符串等。

public interface Wan { @POST(“user/login”) @FormUrlEncoded Call《ResponseBody》 login(@Field(“username”) String username, @Field(“password”) String password);}

8.FormUrlEncoded注解和FieldMap注解

有時(shí)候表單的參數(shù)會(huì)比較多,如果使用Field注解,方法的參數(shù)就會(huì)比較多,此時(shí)就可以使用FieldMap注解,F(xiàn)ieldMap注解以map的形式發(fā)送一個(gè)表單請(qǐng)求。如果被FieldMap注解修飾的參數(shù)不是Map類型,就會(huì)報(bào)異常。如果Map的鍵值對(duì)為空,也會(huì)報(bào)異常。

public interface Wan { @POST(“user/login”) @FormUrlEncoded Call《ResponseBody》 login(@FieldMap Map《String, String》 map);}

9. Body注解

服務(wù)端會(huì)要求客戶端把json字符串作為請(qǐng)求體發(fā)給服務(wù)端。此時(shí)就可以使用Body注解定義的參數(shù)直接傳入一個(gè)實(shí)體類,內(nèi)部會(huì)把該實(shí)體序列化并將序列化后的結(jié)果直接作為請(qǐng)求體發(fā)送出去。 如果被Body注解修飾的參數(shù)的類型是RequestBody對(duì)象,那調(diào)用者可以不用添加數(shù)據(jù)轉(zhuǎn)換器,內(nèi)部會(huì)使用默認(rèn)的數(shù)據(jù)轉(zhuǎn)換器。

如果被Body注解修飾的參數(shù)的類型不是RequestBody對(duì)象,是一個(gè)具體的實(shí)體類,那調(diào)用者需要自定義一個(gè)類,并且繼承Converter.Factory。

public interface Wan { /** * 被Body注解修飾的參數(shù)的類型是RequestBody對(duì)象,那調(diào)用者可以不添加數(shù)據(jù)轉(zhuǎn)換器,內(nèi)部會(huì)使用默認(rèn)的數(shù)據(jù)轉(zhuǎn)換器 * * @param body * @return */ @POST(“user/register”) Call《ResponseBody》 register(@Body RequestBody body);

/** * 被Body注解修飾的參數(shù)的類型不是RequestBody對(duì)象,是一個(gè)具體的實(shí)體類,那調(diào)用者需要自定義一個(gè)類,并且繼承Converter.Factory * * @param user * @return */ @POST(“user/register”) Call《ResponseBody》 register(@Body User user);}

10.Url注解

Url注解用于添加接口的完整地址。在Retrofit里面,如果接口的域名與創(chuàng)建retrofit對(duì)象指定的域名不相同,就會(huì)使用Url注解來(lái)解決問(wèn)題。在蒹葭里面不但可以使用Url注解來(lái)解決問(wèn)題,還提供了BaseUrl來(lái)解決該問(wèn)題。

public interface Wan {

@GET() Call《ResponseBody》 getArticle(@Url String url);

}

11.Header注解

Header注解是作用于參數(shù)上的注解,用于添加請(qǐng)求頭。

public interface Wan {

@GET() Call《ResponseBody》 foo(@Header(“Accept-Language”) String lang);

}

12.Headers注解

Headers注解是作用于方法上的注解,用于添加一個(gè)或多個(gè)請(qǐng)求頭。

public interface Wan { @Headers(“Cache-Control: max-age=640000”) @GET(“/”) Call《ResponseBody》 getArticle(@Url String url); @Headers({ “X-Foo: Bar”, “X-Ping: Pong” }) @GET(“/”) Call《ResponseBody》 getArticle(@Url String url);}

13.HeaderMap注解

HeaderMap注解是作用于參數(shù)上的注解,以Map的形式添加請(qǐng)求頭,Map中每一項(xiàng)的鍵和值都不能為空,否則會(huì)報(bào)異常。

public interface Wan {

@GET(“/search”) Call《ResponseBody》 list(@HeaderMap Map《String, String》 headers);

}

14. Multipart注解和Part注解

Multipart注解和Part注解用于上傳單個(gè)文件。 在配置文件添加下面兩個(gè)權(quán)限,這兩個(gè)權(quán)限需要?jiǎng)討B(tài)申請(qǐng)。

ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA

定義一個(gè)upload方法,方法參數(shù)使用Part注解修飾,參數(shù)類型必須是MultipartBody.Part。

public interface Wan {

/** * 上傳文件,需要使用Multipart注解和Part注解 * * @param photo 本地文件的路徑 * @return */ @Multipart @POST() Call《ResponseBody》 upload(@Part MultipartBody.Part photo);}// 文件路徑File file = new File(getExternalCacheDir(), “icon.png”);// 創(chuàng)建請(qǐng)求體對(duì)象RequestBody photoBody = RequestBody.create(MediaType.parse(“image/png”), file);// MultipartBody.Part photo = MultipartBody.Part.createFormData(“photos”, “icon.png”, photoBody);

JianJia jianJia = new JianJia.Builder() .baseUrl(“https://www.wanandroid.com”) .build();

Wan wan = jianJia.create(Wan.class);// 上傳文件wan.upload(photo).enqueue(new Callback《ResponseBody》() { @Override public void onResponse(Call《ResponseBody》 call, Response《ResponseBody》 response) { // 上傳成功 }

@Override public void onFailure(Call《ResponseBody》 call, Throwable t) { LogUtils.info(“yunfei”, t.getMessage()); }});

15.PartMap注解和Multipart注解

PartMap注解和Multipart注解用于上傳多個(gè)文件在配置文件添加下面兩個(gè)權(quán)限,這兩個(gè)權(quán)限需要?jiǎng)討B(tài)申請(qǐng):

ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA

被PartMap注解修飾的Map,Map的第一個(gè)泛型必須是String:

public interface Wan {

/** * 使用PartMap注解上傳多個(gè)文件 * * @param params 第一個(gè)泛型必須是String * @return */ @Multipart @POST() Call《ResponseBody》 upload(@PartMap Map《String, RequestBody》 params);}File photoFile = new File(getExternalCacheDir(), “photo.png”);RequestBody photoBody = RequestBody.create(MediaType.parse(“image/png”), photoFile);

File avatarFile = new File(getExternalCacheDir(), “avatar.png”);RequestBody avatarBody = RequestBody.create(MediaType.parse(“image/png”), avatarFile);Map《String, RequestBody》 photos = new HashMap《》();photos.put(“photo”, photoBody);photos.put(“avatar”, avatarBody);

JianJia jianJia = new JianJia.Builder() .baseUrl(“https://www.wanandroid.com”) .build();

Wan wan = jianJia.create(Wan.class);// 上傳文件wan.upload(photos).enqueue(new Callback《ResponseBody》() { @Override public void onResponse(Call《ResponseBody》 call, Response《ResponseBody》 response) { // 上傳成功 }

@Override public void onFailure(Call《ResponseBody》 call, Throwable t) { LogUtils.info(“yunfei”, t.getMessage()); }});

16.添加數(shù)據(jù)轉(zhuǎn)換器

之前我們?cè)诮涌诶锩娑x方法(GET注解中)的時(shí)候,方法的返回值Call對(duì)象,泛型是ResponseBody。在這種情況下,服務(wù)端返回給客戶端的數(shù)據(jù)就會(huì)在ResponseBody里面,客戶端需要手動(dòng)解析json,將json解析成一個(gè)實(shí)體類。 其實(shí),我們沒(méi)必要手動(dòng)解析json,可以讓gson幫我們解析json。蒹葭支持添加數(shù)據(jù)轉(zhuǎn)換器,在創(chuàng)建對(duì)象的時(shí)候添加數(shù)據(jù)轉(zhuǎn)換器,也就是把gson添加進(jìn)來(lái)。在onResponse方法里面就可以直接得到實(shí)體類對(duì)象了,gson幫我們把json解析成了一個(gè)實(shí)體類。

public interface Wan { @GET(“banner/json”) Call《Banner》 getBanner();}JianJia jianJia = new JianJia.Builder() .baseUrl(“https://www.wanandroid.com”) .addConverterFactory(GsonConverterFactory.create()) .build();Wan wan = jianJia.create(Wan.class);wan.getBanner().enqueue(new Callback《Banner》() { @Override public void onResponse(Call《Banner》 call, Response《Banner》 response) { try { if (response.isSuccessful()) { Banner banner = response.body(); } } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call《Banner》 call, Throwable t) { LogUtils.info(“yunfei”, t.getMessage()); }});

03

Demo演示

● 示例中的網(wǎng)頁(yè)地址:

https://www.wanandroid.com/blog/show/2 視頻內(nèi)顯示的是一個(gè)網(wǎng)頁(yè)上的文章列表。客戶端通過(guò)使用蒹葭網(wǎng)絡(luò)庫(kù)訪問(wèn)該網(wǎng)站提供的接口,以此來(lái)獲取網(wǎng)頁(yè)的文章列表,當(dāng)請(qǐng)求成功后,文章列表將顯示在模擬器頁(yè)面上。

以下為Demo代碼關(guān)鍵步驟的詳解:

1.在com.poetry.jianjia.net包下面創(chuàng)建了如下的接口,把所有的請(qǐng)求放在一個(gè)接口里面即可, 無(wú)需創(chuàng)建多個(gè)接口類。

/** * @author 裴云飛 * @date 2021/1/23 */public interface Wan {

@GET(“article/list/{page}/json”) Call《ResponseBody》 getArticle(@Path(“page”) int page);

@GET(“article/list/{page}/json”) Call《Article》 getHomeArticle(@Path(“page”) int page);

@GET() Call《ResponseBody》 getArticle(@Url String url);

@GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@Query(“k”) String k);

@GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@Query(“k”) String.。。 k);

@GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@Query(“k”) List《String》 k);

@GET(“wxarticle/list/405/1/json”) Call《ResponseBody》 search(@QueryMap Map《String, String》 param);

@GET(“article/list/0/json”) Call《ResponseBody》 getArticle(@QueryMap Map《String, String》 param);

@BaseUrl(“https://api.apiopen.top”) @GET(“getJoke”) Call《ResponseBody》 getJoke(@QueryMap Map《String, String》 param);

@POST(“user/login”) @FormUrlEncoded Call《ResponseBody》 login(@Field(“username”) String username, @Field(“password”) String password);

@POST(“user/login”) @FormUrlEncoded Call《ResponseBody》 login(@FieldMap Map《String, String》 map);

@GET(“banner/json”) Call《Banner》 getBanner();}

(左右滑動(dòng)查看更多)

2.創(chuàng)建“jianjia”對(duì)象,整個(gè)項(xiàng)目只需一個(gè)jianjia對(duì)象即可。 如何確保只有一個(gè) jianjia對(duì)象?當(dāng)代碼運(yùn)行起來(lái)后,首先會(huì)創(chuàng)建AbilityPackage對(duì)象,調(diào)用AbilityPackage的onInitialize方法,AbilityPackage執(zhí)行完成后才會(huì)啟動(dòng)Ability。AbilityPackage就是一個(gè)全局的單例,所以在 AbilityPackage里面創(chuàng)建的對(duì)象就是一個(gè)單例對(duì)象。只需在AbilityPackage 里面創(chuàng)建jianjia對(duì)象,就能確保整個(gè)項(xiàng)目只有一個(gè)jianjia對(duì)象。AbilityPackage這個(gè)類不需要手動(dòng)創(chuàng)建,在創(chuàng)建的項(xiàng)目的時(shí)候, 編譯器會(huì)自動(dòng)創(chuàng)建一個(gè)繼承于AbilityPackage的類。

public class BaseApplication extends AbilityPackage {

private static BaseApplication instance;

private JianJia mJianJia; private Wan mWan;

public static BaseApplication getInstance() { return instance; }

/** * 獲取全局的蒹葭對(duì)象 * * @return 全局的蒹葭對(duì)象 */ public JianJia getJianJia() { return mJianJia; }

/** * 獲取全局的接口實(shí)例對(duì)象 * * @return 全局的接口實(shí)例對(duì)象 */ public Wan getWan() { return mWan; }

@Override public void onInitialize() { super.onInitialize(); instance = this; // 創(chuàng)建全局的蒹葭對(duì)象 mJianJia = new JianJia.Builder() .baseUrl(“https://www.wanandroid.com”) .addConverterFactory(GsonConverterFactory.create()) .build(); mWan = mJianJia.create(Wan.class); }}

如上面的代碼,BaseApplication繼承AbilityPackage,在onInitialize 方法創(chuàng)建全局的蒹葭對(duì)象。同時(shí),整個(gè)項(xiàng)目只創(chuàng)建了一個(gè)接口類,所以可以在創(chuàng)建完蒹葭對(duì)象后直接調(diào)用蒹葭的create方法來(lái)創(chuàng)建接口的實(shí)例對(duì)象。其它地方只需要通過(guò)下面的方式即可獲取蒹葭對(duì)象和接口實(shí)例對(duì)象。

// 獲取全局的蒹葭對(duì)象BaseApplication.getInstance().getJianJia();// 獲取全局的接口實(shí)例對(duì)象BaseApplication.getInstance().getWan();

3.在MainAbilitySlice里面添加ListContainer,關(guān)于ListContainer的用法,請(qǐng)查看 官方文檔 ,此處不再贅述。

● 官方文檔

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-listcontainer-0000001060007847

接著調(diào)用“getHomeArticle方法”請(qǐng)求服務(wù)器,“getHomeArticle方法”會(huì)獲取在AbilityPackage里面創(chuàng)建好的對(duì)象,然后執(zhí)行網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求成功后調(diào)用“setHomeArticle方法”來(lái)刷新頁(yè)面。

public class MainAbilitySlice extends AbilitySlice {

private ListContainer mListContainer; private HomeArticleProvider mHomeArticleProvider; List《Article.Data.Datas》 mDatas;

@Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); mListContainer = (ListContainer) findComponentById(ResourceTable.Id_list); mDatas = new ArrayList《》(); mHomeArticleProvider = new HomeArticleProvider(this, mDatas); mListContainer.setItemProvider(mHomeArticleProvider); // 從服務(wù)端獲取數(shù)據(jù) getHomeArticle(); }

/** * 從服務(wù)端獲取數(shù)據(jù) */ public void getHomeArticle() { BaseApplication.getInstance().getWan().getHomeArticle(0).enqueue(new Callback《Article》() { @Override public void onResponse(Call《Article》 call, Response《Article》 response) { if (response.isSuccessful()) { // 請(qǐng)求成功 setHomeArticle(response.body()); } }

@Override public void onFailure(Call《Article》 call, Throwable t) { // 請(qǐng)求失敗 LogUtils.info(“yunfei”, t.getMessage()); } }); }

@Override public void onActive() { super.onActive(); }

@Override public void onForeground(Intent intent) { super.onForeground(intent); }

public void setHomeArticle(Article article) { if (article == null || article.data == null || article.data.datas == null) { return; } mDatas.addAll(article.data.datas); // 刷新列表 mHomeArticleProvider.notifyDataChanged(); }

}

(左右滑動(dòng)查看更多)

04

關(guān)于轉(zhuǎn)義字符問(wèn)題的解決

如果服務(wù)端返回的json有特殊字符,比如中文的雙引號(hào)。gson在解析的時(shí)候會(huì)對(duì)特殊字符進(jìn)行轉(zhuǎn)義,這時(shí)就需要將轉(zhuǎn)義后的字符串進(jìn)行反轉(zhuǎn)義。如下圖所示:

如何將轉(zhuǎn)義后的字符串進(jìn)行反轉(zhuǎn)義?commons-lang這個(gè)庫(kù)可以將轉(zhuǎn)義后的字符串進(jìn)行反轉(zhuǎn)義,在build.gradle文件添加下的依賴。

// commons-lang可以對(duì)特殊字符進(jìn)行轉(zhuǎn)義和反轉(zhuǎn)義implementation ‘commons-lang2.6’

調(diào)用StringEscapeUtils的unescapeHtml方法,如果字符串中沒(méi)有轉(zhuǎn)義字符,unescapeHtml方法會(huì)直接返回原字符串,否則會(huì)對(duì)字符串進(jìn)行反轉(zhuǎn)義。具體的代碼可查看示例代碼中的HomeArticleProvider類。

// json里面有一些特殊符號(hào),特殊符號(hào)會(huì)被gson轉(zhuǎn)義,// StringEscapeUtils可以對(duì)轉(zhuǎn)義的字符串進(jìn)行反轉(zhuǎn)義String title = StringEscapeUtils.unescapeHtml(data.title);componentHolder.title.setText(title);

反轉(zhuǎn)義之后,特殊字符即可正常顯示:

溫馨提示:如果開(kāi)發(fā)者具備以下知識(shí)的基礎(chǔ),看源碼的時(shí)會(huì)更加輕松哦。

熟悉okhttp的常見(jiàn)用法

熟悉面向接口編程、反射、泛型、注解

熟悉構(gòu)造者模式、適配器模式、工廠模式、策略模式、靜態(tài)代理、動(dòng)態(tài)代理、責(zé)任鏈模式等設(shè)計(jì)模式

Demo剛運(yùn)行的時(shí)候頁(yè)面可能會(huì)出現(xiàn)白屏的情況,是因?yàn)榇藭r(shí)正在請(qǐng)求網(wǎng)絡(luò)??梢栽黾右粋€(gè)進(jìn)度條來(lái)提升用戶體驗(yàn),大家可以自行添加~

目前只獲取了第一頁(yè)的文章列表,有興趣的開(kāi)發(fā)者可以自行實(shí)現(xiàn)分頁(yè)加載,讓內(nèi)容更加豐富,由于篇幅有限,此處只展示簡(jiǎn)單的示例。

本文作者:裴云飛,愛(ài)奇藝應(yīng)用開(kāi)發(fā)工程師

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    9282

    瀏覽量

    154296
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    10000

    瀏覽量

    90126
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4922

    瀏覽量

    72236
  • 接口編程
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    8843
  • OpenHarmony
    +關(guān)注

    關(guān)注

    31

    文章

    3891

    瀏覽量

    20191

原文標(biāo)題:【開(kāi)發(fā)者說(shuō)】HarmonyOS如何實(shí)現(xiàn)一套網(wǎng)絡(luò)請(qǐng)求框架

文章出處:【微信號(hào):HarmonyOS_Dev,微信公眾號(hào):HarmonyOS開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    怎么實(shí)現(xiàn)一套容器運(yùn)行時(shí),并符合OCI規(guī)范?

    如題,怎么實(shí)現(xiàn)一套容器運(yùn)行時(shí),并符合OCI規(guī)范
    發(fā)表于 10-10 07:35

    如何搭建一套安防監(jiān)控管理平臺(tái)?

    構(gòu)建一套現(xiàn)代化的安防監(jiān)控管理平臺(tái),本質(zhì)上是建設(shè)個(gè)集數(shù)據(jù)采集、傳輸、處理、存儲(chǔ)、分析與應(yīng)用于體的綜合型技術(shù)中樞。其技術(shù)架構(gòu)需遵循模塊化、高可用、可擴(kuò)展及開(kāi)放性的設(shè)計(jì)原則,具體可分為以下四個(gè)核心層
    的頭像 發(fā)表于 09-04 16:19 ?564次閱讀
    如何搭建<b class='flag-5'>一套</b>安防監(jiān)控管理平臺(tái)?

    HarmonyOSAI編程智能代碼解讀

    CodeGenie > Explain Code,開(kāi)始解讀當(dāng)前代碼內(nèi)容。 說(shuō)明 最多支持解讀20000字符以內(nèi)的代碼片段。 使用該功能需先完成CodeGenie登錄授權(quán)。 本文主要從參考引用自HarmonyOS官方文檔
    發(fā)表于 09-02 16:29

    分支多、云也多,網(wǎng)絡(luò)又慢又燒錢?一套方案全搞定!

    、成本控制與運(yùn)維效率的多重壓力。面對(duì)這些挑戰(zhàn),是否有一套網(wǎng)絡(luò)架構(gòu)能夠“全搞定”?答案是肯定的?;谛袠I(yè)實(shí)踐與技術(shù)演進(jìn),我們逐漸形成了一套以SD-WAN+云網(wǎng)融合平臺(tái)+
    的頭像 發(fā)表于 08-28 14:25 ?847次閱讀
    分支多、云也多,<b class='flag-5'>網(wǎng)絡(luò)</b>又慢又燒錢?<b class='flag-5'>一套</b>方案全搞定!

    德思特案例 | 一套設(shè)備兼容四大測(cè)試場(chǎng)景:全面解析弱網(wǎng)測(cè)試方案

    隨著用戶對(duì)網(wǎng)絡(luò)體驗(yàn)要求的不斷提升,弱網(wǎng)環(huán)境下的穩(wěn)定性已不再是“加分項(xiàng)”,而是終端產(chǎn)品必須具備的“基本功”。德思特通過(guò)現(xiàn)網(wǎng)模擬 + 參數(shù)可控 + 自動(dòng)化測(cè)試 + 創(chuàng)新硬件設(shè)計(jì),為行業(yè)提供了一套完整、可復(fù)用、可擴(kuò)展的弱網(wǎng)測(cè)試解決方案。
    的頭像 發(fā)表于 08-08 10:47 ?680次閱讀
    德思特案例 | <b class='flag-5'>一套</b>設(shè)備兼容四大測(cè)試場(chǎng)景:全面解析弱網(wǎng)測(cè)試方案

    HarmonyOS AI輔助編程工具(CodeGenie)代碼智能解讀

    。 選中.ets文件或者.cpp文件中需要被解釋的代碼行或代碼片段,右鍵選擇CodeGenie > Explain Code,開(kāi)始解讀當(dāng)前代碼內(nèi)容。 說(shuō)明 ?最多支持解讀20000字符以內(nèi)
    發(fā)表于 07-17 17:02

    HarmonyOS NEXT意圖框架習(xí)慣推薦場(chǎng)景說(shuō)明

    、概述 意圖框架HarmonyOS系統(tǒng)級(jí)的意圖標(biāo)準(zhǔn)體系。將應(yīng)用和元服務(wù)的業(yè)務(wù)功能智慧分發(fā)給不同的系統(tǒng)入口,以“音樂(lè)播放”為例,HarmonyOS將業(yè)務(wù)分發(fā)給“小藝建議”,提供了桌面
    發(fā)表于 06-18 15:06

    AUTOSAR通信框架的優(yōu)勢(shì) AUTOSAR通信實(shí)例與應(yīng)用場(chǎng)景

    ,以簡(jiǎn)化汽車電子控制單元(ECU)的開(kāi)發(fā)和生產(chǎn)。AUTOSAR通信框架是該架構(gòu)的核心組成部分之,它提供了一套標(biāo)準(zhǔn)化的通信機(jī)制,使得不同ECU之間的通信變得更加高效和可靠。以下是AUTOSAR通信
    的頭像 發(fā)表于 12-17 14:58 ?1527次閱讀

    HarmonyOS NEXT應(yīng)用元服務(wù)開(kāi)發(fā)Intents Kit(意圖框架服務(wù))綜述

    、綜述 Intents Kit(意圖框架服務(wù))是HarmonyOS級(jí)的意圖標(biāo)準(zhǔn)體系 ,意圖連接了應(yīng)用/元服務(wù)內(nèi)的業(yè)務(wù)功能。 意圖框架能幫開(kāi)發(fā)者將應(yīng)用/元服務(wù)內(nèi)的業(yè)務(wù)功能,智能分發(fā)到各
    發(fā)表于 11-28 10:43

    Vector推出一套基于Visual Studio Code的免費(fèi)插件

    編寫(xiě)工具(如Vector的CAPL Browser)雖然功能強(qiáng)大,但是結(jié)合Visual Studio Code更能夠滿足多語(yǔ)言編程和集成現(xiàn)代開(kāi)發(fā)工具的需求。 因此,Vector推出一套基于Visual
    的頭像 發(fā)表于 11-24 14:15 ?2795次閱讀
    Vector推出<b class='flag-5'>一套</b>基于Visual Studio Code的免費(fèi)插件

    HarmonyOS NEXT應(yīng)用元服務(wù)開(kāi)發(fā)Intents Kit(意圖框架服務(wù))習(xí)慣推薦方案概述

    用戶的行為習(xí)慣。 2.在HarmonyOS學(xué)習(xí)到用戶的行為習(xí)慣后,會(huì)給用戶推薦相應(yīng)功能,并且嘗試補(bǔ)充詳細(xì)功能參數(shù),減少用戶執(zhí)行任務(wù)的步驟。 以聽(tīng)音樂(lè)為例,意圖框架設(shè)計(jì)了統(tǒng)的意圖——播放歌單意圖,該意圖可以讓
    發(fā)表于 11-19 17:59

    卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)工具與框架

    卷積神經(jīng)網(wǎng)絡(luò)因其在圖像和視頻處理任務(wù)中的卓越性能而廣受歡迎。隨著深度學(xué)習(xí)技術(shù)的快速發(fā)展,多種實(shí)現(xiàn)工具和框架應(yīng)運(yùn)而生,為研究人員和開(kāi)發(fā)者提供了強(qiáng)大的支持。 TensorFlow 概述
    的頭像 發(fā)表于 11-15 15:20 ?930次閱讀

    Python編程:處理網(wǎng)絡(luò)請(qǐng)求的代理技術(shù)

    網(wǎng)絡(luò)編程中,代理技術(shù)扮演著至關(guān)重要的角色,尤其在處理網(wǎng)絡(luò)請(qǐng)求時(shí)。通過(guò)代理服務(wù)器,我們可以實(shí)現(xiàn)請(qǐng)求的轉(zhuǎn)發(fā)、緩存、負(fù)載均衡以及安全控制等功能。
    的頭像 發(fā)表于 11-12 07:23 ?761次閱讀

    HarmonyOS NEXT應(yīng)用元服務(wù)開(kāi)發(fā)Intents Kit(意圖框架服務(wù))本地搜索方案概述

    、概述 本地搜索是在HarmonyOS化搜索特性,開(kāi)發(fā)者將應(yīng)用/元服務(wù)內(nèi)的功能和內(nèi)容通過(guò)意圖框架共享到HarmonyOS,即可
    發(fā)表于 11-06 10:59

    AWTK 最新動(dòng)態(tài):支持鴻蒙系統(tǒng)(HarmonyOS Next)

    為ToolkitAnyWhere,是ZLG傾心打造的一套基于C語(yǔ)言開(kāi)發(fā)的GUI框架。旨在為用戶提供個(gè)功能強(qiáng)大、高效可靠、簡(jiǎn)單易用、可輕松做出炫酷效果的GUI引擎,支
    的頭像 發(fā)表于 11-06 08:03 ?1025次閱讀
    AWTK 最新動(dòng)態(tài):支持鴻蒙系統(tǒng)(<b class='flag-5'>HarmonyOS</b> Next)