【问题标题】:How to return value from observable to an JavascriptInterface method?如何将值从 observable 返回到 JavascriptInterface 方法?
【发布时间】:2020-06-29 12:15:10
【问题描述】:

我需要返回从手机中检索到的联系人的值,并使用 observable。问题在于返回值。

我在桥中有下一个方法:

@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 返回一个值。

【问题讨论】:

    标签: android return observable rx-java


    【解决方案1】:

    不要从getFavoriteUsers返回结果,而是在您网站的<script>标签内创建一个方法,该方法接受contacts列表作为参数,然后调用此方法。

    ThisStackOverflow 回答解释了如何调用 javascript 函数

    编辑:由于从SharedPreference 加载不会花费太多时间并且您无权访问该网站,因此您可以在 webview 页面的OnCreate 上加载联系人并将结果保存到全局变量中,然后调用 webview 的loadUrl。之后在getFavoriteUsers上返回全局保存的结果

    【讨论】:

    • 我唯一可以修改的代码是Android源代码。网站部分是禁止的。 :(
    • 可以给我们网址吗
    • 是私人项目,我没有权限展示。对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多