在混合开发中,uniapp调用android原生的方法,原生方法在处理过程中无法同步给js返回数据,异步执行,那么可以使用传递uniapp回调函数实现
一、编写android的方法
public class MyLibraryPlugin extends UniModule {
private UniJSCallback mCallback;
/**
* @param args
* @param callback 回调函数
* UniJSCallback用于js和java交互的类
*/
@UniJSMethod(uiThread = true)
public void doTaskAsync(String args, UniJSCallback callback) {
this.mCallback = callback;
obtainSyncResult();
}
/**
* 模拟耗时的异步任务
*/
public void obtainSyncResult() {
if (mCallback != null) {
new Thread(() -> {
try {
Thread.sleep(5000);
JSONObject res = new JSONObject();
res.put("code", "200");
res.put("data", "这是原生方法调用uni的回调函数的参数");
///这是至关重要的一步,执行回调,回调参数只支持字符串,无法传递对象
mCallback.invoke(res.toString());
///mCallback.invokeAndKeepAlive(res.toString());
} catch (Exception e) {
e.fillInStackTrace();
}
}).start();
}
}
}
二、uniapp调用插件异步任务
<template>
<view class="content">
<view class="text-area">
<text class="title">{{title}}</text>
</view>
<view class="text-area" style="margin-top: 20px;">
<button @click="testCallBack()">测试回调接口</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
title:"uniapp调用原生接口传递回调函数Demo"
}
},
methods: {
testCallBack(){
const libPlugin = uni.requireNativePlugin("MyLibraryPlugin");
传入匿名回调函数
libPlugin.doTaskAsync("uniappArgs", (ret) => {
console.log("clickNative---ret-->" + JSON.stringify(ret))
});
},
}
}
</script>