如何迭代Android JavascriptInterface返回的项目?

时间:2011-07-19 15:20:29

标签: java javascript android performance

我有以下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解决方案也有问题,我只能提供静态数据的副本,不能调用方法。

2 个答案:

答案 0 :(得分:0)

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

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;。 所以它有点被骗了..

答案 1 :(得分:0)

如果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例外。