【问题标题】:How to iterate over items returned by an Android JavascriptInterface?如何迭代 Android JavascriptInterface 返回的项目?
【发布时间】:2011-07-19 15:20:28
【问题描述】:

我有以下 Java 接口,

public interface JavascriptInterface
{
    public MyIterator getItems();
}

public interface MyIterator
{
    public boolean hasNext();
    public String next();
}

我将其作为 API 公开给 JavaScript Web 应用程序:

Webview webview;
JavascriptInterface webapi;

//init webview and webapi [..]

webview.addJavascriptInterface(webapi, "webapi");

我想知道是否有可能使用这样的 JavaScript for 循环遍历项目:

for (var item in webapi.getItems())
{
    //do something with item [..]
}

我必须使用/实现什么类型/方法而不是 MyIterator 才能使这成为可能,或者我可以以某种方式转换它(使用 JavaScript 帮助程序)? 我目前使用 JSON 返回一个 String 对象,并使用 JavaScript 库对其进行解析。有没有更简单/更快的解决方案?

编辑:JSON解决方案也有问题,我只能提供静态数据的副本,不能调用方法。

【问题讨论】:

  • 您只能从您的 javascript 界面传回原语和字符串,但这仍然给您留下了很多选择。在最简单的情况下,您可以返回“{'item one','item two'}”,并且您的 javascript 会将其视为一个数组,但您也可以返回一个更复杂的 JSON 对象。在任何情况下,您的方法签名都需要返回一个字符串。我希望这会有所帮助。
  • 至少我还可以返回任何其他自定义接口并在其上调用方法。所以我不太确定我是否应该这么快放弃这个想法。一个简单的 foreach 实现只需要一个boolean hasNext() 和一个AnySupportedType next() 方法。但是这怎么能在javascript中完成呢? :\

标签: java javascript android performance


【解决方案1】:

为了给你一个想法,我可以这样做:

function toArray(iterator)
{
    arr = new Array();
    while (iterator.hasNext())
         arr.push(iterator.next());
    return arr;
}

for (var item in toArray(webapi.getItems()))
{
    //do something with item [..]
}

但我仍然对此并不完全满意,因为当我调用toArray() 时它会重复,而我不能break;。 所以有点被骗了..

【讨论】:

    【解决方案2】:

    如果 Android 将完全支持 JavaScript version 1.7,我可以像这样在 Java 和 JavaScript Iterable 之间进行映射(不幸的是,他们还不支持它,但也许这在未来会起作用):

    function MyIterable(iterable)
    {
        this.iterable = iterable;
    }
    
    MyIterable.prototype.__iterator__ = function() {
        return new MyIterator(this.iterable.iterator());
    };
    
    function MyIterator(iterator) {
        this.iterator = iterator;
    }
    
    MyIterator.prototype.next = function() {
        if (this.iterator.hasNext())
            return this.iterator.next();
        else
            throw StopIteration;
    };
    
    for (var item in new MyIterable(webapi.getItems()))
    {
        //do something with item [..]
    }
    

    function createIterator(iterable)
    {
        var iterator = iterable.iterator();
        while (iterator.hasNext())
            yield iterator.next();
        throw StopIteration;
    }
    
    for (var item in createIterator(webapi.getItems()))
    {
        //do something with item [..]
    }
    

    注意:这次我假设 webapi.getItems() 返回一个 Java Iterable<T>

    我不知道__iterator__() 是否是Java 中的有效方法名称,但您也可以考虑在Java 中返回一个自定义的Iterable/Iterator 接口,实现__iterator__()next()。唯一的问题是,如何抛出StopIteration 异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2021-09-26
      • 2014-01-15
      相关资源
      最近更新 更多