2011-07-19 50 views
2

我有以下的Java接口,如何遍歷Android JavascriptInterface返回的項目?

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解決方案也有問題,我只能提供靜態數據的副本,不能調用方法。

+1

你只能從你的javascript界面​​傳回原始數據和字符串,但仍然會給你提供很多選項。在最簡單的情況下,你可以返回「{'項目一','項目二'}」,你的javascript會把它當作一個數組,但是你也可以返回一個更復雜的JSON對象。無論如何,你的方法簽名將需要返回一個字符串。 我希望這很有幫助。 –

+0

至少我還可以返回任何其他自定義接口並調用其上的方法。所以我不太確定我是否應該如此放棄這個想法。一個簡單的foreach實現只需要一個'boolean hasNext()'和一個'AnySupportedType next()'方法。但是,這怎麼能在JavaScript中完成呢? :\ – Nappy

回答

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中返回一個自定義的可迭代/ Iterator接口,實現__iterator__()next()。唯一的問題是,如何拋出StopIteration異常。

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;。 所以它的一點點作弊..