【关键字】服务卡片、元服务、API6、网络请求、图片加载
一、API6服务卡片Java代码中如何进行网络请求?
API6服务卡片基于FormAbility,一般元服务默认工程中的FormAbility就是MainAbility。由于FormAbility是Java语言编写的,可以使okhttp进行网络请求相关的开发。
1、添加依赖:
首先在entry的build.gradle中添加如下依赖:
javascript
dependencies {
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
}
Okhttp相关的使用可以参考Okhttp官网文档,链接如下:Overview - OkHttp (square.github.io)
2、使用方法,这边以Get请求为例,说明一下Okhttp的简单用法:
初始化OkhttpClient和request:
javascript
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)//请求地址
.get()//Get方式请求
.build();
a、同步请求:
javascript
try {
Response response=okHttpClient.newCall(request).execute();
if(response.isSuccessful()){
HiLog.info(TAG,"response success "+response.body().string());
response.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
b、异步请求:
javascript
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try{
if (response.isSuccessful()) {
HiLog.info(TAG,"response success "+response.body().string());
response.close();
}
} catch (IOException e) {
throw new IOException(e);
}
}
});
我们通过使用okhttputils工具类库可以进一步简化请求代码:
Okhttputils使用说明:okhttputils: 对okhttp的封装类 (gitee.com)
依赖引用:
javascript
dependencies {
implementation 'io.openharmony.tpc.thirdlib:okhttputils:1.0.1'
}
同步请求:
javascript
Response response = OkHttpUtils
.get()//
.url(url)//
.tag(this)//
.build()//
.execute();
异步请求:
javascript
String url = "http://www.csdn.net/";
OkHttpUtils
.get()
.url(url)
.addParams("username", "hyman")
.addParams("password", "123")
.build()
.execute(new StringCallback()
{
@Override
public void onError(Request request, Exception e)
{
}
@Override
public void onResponse(String response)
{
}
});
二、如何通过网络请求数据进行服务卡片初始化?
由于我们是FormAbility的onCreateForm中完成卡片的创建,下面以创建卡片为例,说明该如何完成网络数据创建卡片。
如官网的示例中我们需要在onCreateForm中创建ProviderFormInfo,所以我们可以将通过网络请求获取的数据传入FormBindingData中,完成卡片的的初始化。
需要注意的是,在初始化卡片的时候,需要使用的Okhttp进行同步请求,请求完成后将数据传入FormBindingData,以下代码使用OkHttpUtils编写,,封装一个getData方法返回FormBindingData对象:
javascript
public FormBindingData getData(){
try {
Response response=OkHttpUtils.get().url("url").build().execute();
String str=response.body().string();
HiLog.info(TAG, "onCreateForm: body "+str);
response.close();
return new FormBindingData(str);
} catch (Exception e) {
HiLog.info(TAG, "onCreateForm: Exception "+e.toString()+" "+e.getMessage());
}
return new FormBindingData();
}
也可以通过ZSONObject获取java bean后,创建FormBindingData对象,如下:
javascript
public FormBindingData getData(){
try {
Response response=OkHttpUtils.get().url("url").build().execute();
String str=response.body().string();
HiLog.info(TAG, "onCreateForm: body "+str);
response.close();
HotData hotData=ZSONObject.stringToClass(str, HotData.class);//str转化为java对象
ZSONObject zsonObject = new ZSONObject();
zsonObject.put("data",hotData.getData());//获取对象中的字段,赋值给ZSONObject
return new FormBindingData(zsonObject);//通过ZSONObject创建FormBindingData
} catch (Exception e) {
HiLog.info(TAG, "onCreateForm: Exception "+e.toString()+" "+e.getMessage());
}
return new FormBindingData();
}
创建FormBindingData后传入formInfo完成卡片初始化:
javascript
ProviderFormInfo formInfo = new ProviderFormInfo();
formInfo.setJsBindingData(getData());
return formInfo;
三、如何在卡片触发事件和定时定点刷新时通过网络请求刷新卡片内容?
卡片的点击事件会在onTriggerFormEvent中触发,定时定点刷新需要在onUpdateform中完成,所有的更新卡片的操作都是通过updateForm(formId, formBindingData)方法完成的。所以,同样可以使用getData方法获取formBindingData后就可以进行卡片内容的刷新。
四、如何加载网络图片?
加载网络图片,官网是通过内存图片的方式进行加载的,参考链接如下:文档中心
同样我们可以使用okhttp获取网络图片的bytes内容,然后通过formBindingData.addImageData("xxx.png", bytes)的方式进行图片内容的绑定。
bytes数据可以用以下方法获取
javascript
public byte[] getImageData(String url){
byte[] bytes=null;
try {
Response response=OkHttpUtils.get().url(url).build().execute();
if(response.isSuccessful()){
if(response.body()!=null){
bytes= response.body().bytes();
}
response.close();
HiLog.info(TAG, "getImageData: success");
}else{
HiLog.info(TAG, "getImageData: failed");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return bytes;
}
然后在onCreateForm中参考官网方法进行初始化:
javascript
@Override
protected ProviderFormInfo onCreateForm(Intent intent) {
HiLog.info(TAG, "onCreateForm");
ZSONObject zsonObject = new ZSONObject();
String image="logo"+System.currentTimeMillis()+".png";
HiLog.info(TAG, "onCreateForm: image=" + image);
zsonObject.put("imageSrc", "memory://"+image);
FormBindingData formBindingData = new FormBindingData(zsonObject);
ProviderFormInfo formInfo = new ProviderFormInfo();
formBindingData.addImageData(image,getImageData("url"));
formInfo.setJsBindingData(formBindingData);
return formInfo;
}
定时刷新和点击触发刷新同理,就不再赘述了。