2016-04-27 4 views
0

コードのプラグインからアプリケーションのJavaScriptスコープに戻す方法を理解できません。私はプラグインに値を送ることができます。私はphonegapビルドを使用しています。phonegapアプリからプラグインメソッドを呼び出すと、ネイティブアンドロイド関数から返されたデータは常にスコープ外です(未定義)

プラグインのJavaScript:

var exec = require('cordova/exec'); 

module.exports = { 

getSomething: function(successCallback) { exec(successCallback, 
null, "PluginName", "getSomething", []); } }; 

プラグインのJava:

import blah blah blah; 

public class PluginName extends CordovaPlugin { public PluginName(){ } 

    public boolean execute(String action, JSONArray args, CallbackContext 
    callbackContext) throws JSONException { 

    if(action.equals("getSomething")) 
    {  this.getSomething(callbackContext); } } else { return false; } 
    return true; } 



    public void getSomething(CallbackContext callbackGetVol) { AndroidClass ac = 
    (AndroidClass) 
    this.cordova.getActivity().getSystemService(Context.SOME_SERVICE); 

    int data_needed = ac.androidGetMethod(parameters); 

    callbackGetVol.success(data_needed); callbackGetVol.error("error"); } 

アプリのJavaScript:

これは素晴らしい作品:

ここではコードです
PluginName.getSomething(function(data_needed) {Log("data = " + data_needed);}); 

しかし、ここでは、app_variableは「未定義」常にある:

var app_variable; 
PluginName.getSomething(function(data_needed) {app_variable = data_needed;}); 

私はアプリのJavaScriptでdata_needed使用したいが、それは唯一のコールバックの体の範囲内で定義されています。

私はアプリのスコープにあるの機能(およびそのバリエーション)を通過しようとしました:

var foo = function() { 
      var local_variable = 0; 
      return { 
       bar: function() { 
        PluginName.getSomething(function(local_variable){ 
        return local_variable;}); 
       } 
      }; 
     }(); 
     app_variable = foo.bar(); 

しかし、「app_variableは、」常に「未定義」です。私は間違って何をしていますか?

+0

私は驚いています。成功([data from java to js])の代わりにgetSomething内のvar callbackGetVolで関数sendPluginResult([data to java to js])を使用しないでください。それはあなたの問題ではないので、あなたのjavascriptに必要なデータを返信しますか?あなたは、グローバル変数の中でJavaからjavascriptに返送されるコンテンツを入れたいですか? – nyluje

+0

@apdobajあなたはCordova/Phonegapの仕組みに関するいくつかの誤解があります。あなたがJavaを見ているなら、あなたは間違ったことをしています。 - このFAQも役立つはずです。最初に**太字の**文章を読んでください。 [Cordova/Phonegapを初めて使用するデベロッパーの主な誤り](https://github.com/jessemonroy650/top-phonegap-mistakes/blob/master/new-to-Phonegap.md) – JesseMonroy650

+0

@nyluje、私はsendPluginResult次のようにします。PluginResult dataResult = new PluginResult(PluginResult.Status.OK、vol); dataResult.setKeepCallback(true); callbackGetVol.sendPluginResult(dataResult);結果は同じです。 phonegapビルドツールは、キーワード "static"が好きではないようです。Jesse、私はベストプラクティスを使用していないことを十分に認識していますが、実際に何をしているのかを実際に知っている誰かが書き直すような理解を持って作業を進めています。そのブログにはすでにたくさんの情報がありますが、その多くは既に見てきました。 – apdobaj

答えて

0

は、Java側では、このような何かを試してみてください:

public class MyPlugin extends CordovaPlugin { 
    private static CallbackContext listenerCallbackContext; 

public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException { 
    Log.i(APP_TAG,"execute("+action+","+args+","+callbackContext+") starts"); 
if(action.equals("getSomething")) 
{  
     this.bindListener(callbackContext); 
} else { return false; } 
} 

private boolean bindListener(final CallbackContext callbackContext){ 
    Log.i(APP_TAG,"listener(callbackContext) starts"); 
    cordova.getThreadPool().execute(new Runnable() { 
     public void run(){ 
      try{ 
       listenerCallbackContext = callbackContext; 
       /////////////////////////////////// 
       //// FOR THE DEMO sendToJS() should be triggered when you get your result from JAVA 
       ////////////////////////////////////// 
       MyPlugin.sendToJS(); 
       //////////////////////////// 
       /////////////////// 
       /////////////////////// 
      }catch(Exception e){e.printStackTrace();} 
     } 
    }); 
    return true; 
} 

public static void sendToJS(){ 
    Log.i(APP_TAG, "sendToJS() starts"); 
    JSONObject eventData = new JSONObject(); 
    try { 
     eventData.put("EVENT_DATA", "event_data"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, eventData); 
    pluginResult.setKeepCallback(true); 
    try{ 
      listenerCallbackContext.sendPluginResult(pluginResult); 
    } catch(NullPointerException e){ 
     e.printStackTrace(); 
    } 
    Log.i(APP_TAG, "sendQrCodeToJS() stops"); 

} 
} 
0

私は(私はアプリのjsファイルで公開するデータを渡された)ものを少し再配置が、これは私のために動作しませんでした。アプリのJSで

private boolean bindListener(final CallbackContext callbackContext, final int event_data){ 
    Log.i("xyz-plugin","listener(callbackContext) starts"); 
    cordova.getThreadPool().execute(new Runnable() { 
     public void run(){ 
      try{ 
       CallbackContext listenerCallbackContext = callbackContext; 
       /////////////////////////////////// 
       //// FOR THE DEMO sendToJS() should be triggered when you get your result from JAVA 
       ////////////////////////////////////// 
       PluginName.sendToJS(listenerCallbackContext, event_data); 
       //////////////////////////// 
       /////////////////// 
       /////////////////////// 
      }catch(Exception e){e.printStackTrace();} 
     } 
    }); 
    return true; 
} 

public static void sendToJS(CallbackContext listenerCallbackContext, int event_data){ 
    Log.i("xyz-plugin", "sendToJS() starts"); 
    PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, event_data); 
    pluginResult.setKeepCallback(true); 
    try{ 
      listenerCallbackContext.sendPluginResult(pluginResult); 
    } catch(NullPointerException e){ 
     e.printStackTrace(); 
    } 
    Log.i("xyz-plugin", "sendQrCodeToJS() stops"); 
} 

public void getSomething(CallbackContext callbackContext) { 

    int event_data = androidNativeFunction(); 
    this.bindListener(callbackContext, event_data);  
} 

そして:

event_data = 0; 
window.getSomething(function(event_data) {}); 
Log.d("event_data = " + event_data); //always zero 

思考プラグインの.javaファイルで

+0

Log.d( "event_data =" + event_data);内部にあるべきです、function(event_data){}。もっと言えますが、問題の原因を説明できるログ情報が欠けています。あなたが私にそれを見てもらいたいのであれば、プロジェクトをgithubに落としてください(おそらく私はcordova 4.0.0(android API 19)でコンパイルしても実行できます)。 – nyluje

+0

あなたはそうです、nyluje。私がこの原則に服従すると、私は必要なものを手に入れました。 – apdobaj

+0

あなたが聞いてうれしいことはそれを働かせました。私のヒントが正しいので、いくつかの投票を得ることができます;両方の側(java + js)の正しい最終コードで回答を編集する必要がありますが、 "event_data"が入力と出力として使用されているので、ちょっと混乱します。 – nyluje

関連する問題