Как перебрать элементы, возвращаемые Android JavascriptInterface? - PullRequest
2 голосов
/ 19 июля 2011

У меня есть следующие интерфейсы Java,

public interface JavascriptInterface
{
    public MyIterator getItems();
}

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

, которые я представляю в качестве API для веб-приложения JavaScript:

Webview webview;
JavascriptInterface webapi;

//init webview and webapi [..]

webview.addJavascriptInterface(webapi, "webapi");

Интересно, есть ли возможность итерировать поэлементы с JavaScript-циклом, подобным следующему:

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

Какой тип / методы мне нужно использовать / реализовать вместо MyIterator, чтобы сделать это возможным, или я могу как-то преобразовать его (с помощьюJavaScript помощник)?В настоящее время я возвращаю объект String с JSON и анализирую его с помощью библиотеки JavaScript.Есть ли более простое / быстрое решение?

Редактировать: Решение JSON также имеет проблему, заключающуюся в том, что я могу предоставить только копию статических данных и не могу вызывать методы.

Ответы [ 2 ]

0 голосов
/ 20 июля 2011

Если бы Android полностью поддерживал JavaScript версии 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, но вы также можете подумать о возврате пользовательского интерфейса Iterable / Iterator в Java, реализующего __iterator__() и next().Вопрос только в том, как вызвать исключение StopIteration.

0 голосов
/ 19 июля 2011

Чтобы дать вам идею, я мог бы сделать что-то вроде этого:

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;.Так что его немного обманули ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...