android - 如何将值从 observable 返回到 JavascriptInterface 方法?
问题描述
我需要从带有可观察的电话检索的联系人返回值。问题是返回值。
我在桥中有下一个方法:
@JavascriptInterface
public String getFavoriteUsers() {
return getBridgeHelper().getFavoriteUsers();
}
它在帮助器(这是如何执行任务的类)和此帮助器内部调用方法:
@SuppressLint("CheckResult")
public String getFavoriteUsers() {
Observable.fromCallable(() -> {
SharedPreferences sp = getContext().getSharedPreferences(Constants.SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
String userIdStores = sp.getString(Constants.SP_FAVOURITES, "[]");
return new Gson().toJson(ContactsManager.findContactsById(ContactsData.getInstance().contactsStored, userIdStores));
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result -> returnObservedContacts(result),
throwable -> LoggerManager.handlesError(TAG, throwable, throwable.getMessage())
);
}
所以,我需要将此结果返回到上一个桥,但我不清楚如何做到这一点。
谢谢
解决方案:
解决方案是从 Observable 中删除 subscribe 并在末尾添加 blockingFirst。然后,我们可以让 observable 返回一个值。
解决方案
不是从 中返回结果getFavoriteUsers
,而是在您网站的标签内创建一个方法,该方法<script>
接受列表contacts
作为参数,然后调用此方法。
这个StackOverflow 答案解释了如何调用 javascript 函数
编辑:由于从加载SharedPreference
不需要太多时间并且您无权访问该网站,因此您可以OnCreate
在 webview 页面上加载联系人并将结果保存到全局变量,然后调用loadUrl
webview。之后返回全局保存的结果getFavoriteUsers
推荐阅读
- azure - Terraform 将不同环境部署到不同 Azure 订阅的最佳实践
- sql - 加入两个表会给出重复的结果
- c# - 如何不在开源项目的 Visual Studio/C# 代码中存储 API 密钥
- ios - 滑块减速并且移动不顺畅
- node.js - Sequelize:使用 sequelize.query 进行 SQL 注入
- json - 如何在 Map 中查看这个 json 数据
- java - 如何在一定数量的迭代后重新启动循环
- javascript - 如何使用jquery在浏览器后退按钮单击事件上显示警报
- python - 要求输入并在时间到时中断的while循环
- c# - 为什么使用 forEach 的 Where 方法比单独使用 forEach 快