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