在混合开发中,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>