2011-07-19 6 views
2

私はAndroid JavascriptInterfaceによって返されるアイテムを反復処理する方法はありますか?

public interface JavascriptInterface 
{ 
    public MyIterator getItems(); 
} 

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

私はJavaScriptのWebアプリケーションへのAPIとして公開され、次のJavaインタフェースを持っている:

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インターフェイスからプリミティブと文字列を渡すことはできますが、多くのオプションが残っています。最も単純なケースでは、 "{item one '、" item two'} "を返すことができ、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;を傾けるとき、それは反復するので、私は、まだこれで完全に満足していません。 だからちょっと騙されて。

関連する問題