2014-08-28 54 views
2

因此,我看到的例子Cordova插件沒有一個構造函數,所以我可能會在這裏做一些根本性的錯誤。我創建一個用於Android系統,並使用PhoneGap的3.3.0,這是我的問題:爲什麼我無法在CordovaPlugin構造函數中訪問CordovaInterface的實例?

public class MypluginClass extends CordovaPlugin { 

    //...things 

    public MyPluginClass(){ 

     SharedPreferences settings = cordova.getActivity().getPreferences(Activity.MODE_PRIVATE); 
     //The line above fails with a null pointer exception 

     String localVar = settings.getString("importantVariable", "importantDefault"); 

     //...do other things 

    } 

    @Override 
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) { 
     //...many things 
    } 

    ... 
} 

在生產線

SharedPreferences settings = cordova.getActivity().getPreferences(Activity.MODE_PRIVATE); 

我得到:

java.lang.NullPointerException 
    at com.abc.cde.def.MyPluginClass.<init>(MyPluginClass.java:69) 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1208) 
    at org.apache.cordova.PluginEntry.createPlugin(PluginEntry.java:95) 
    at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:278) 
    at org.apache.cordova.PluginManager.execHelper(PluginManager.java:232) 
    at org.apache.cordova.PluginManager.exec(PluginManager.java:227) 
    at org.apache.cordova.ExposedJsApi.exec(ExposedJsApi.java:53) 
    at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
    at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.os.HandlerThread.run(HandlerThread.java:61) 
Error adding plugin com.abc.cde.def.MyPluginClass. 

我之所以我試圖做到這一點是下面的代碼:

public class MyClass extends CordovaActivity{ 
    public void onCreate(Bundle savedInstanceState){ 
      //...things 

      File appDir = context.getExternalFilesDir(null); 
      //create some files at the location above - (step1) 

      SharedPreferences settings = getPreferences(MODE_PRIVATE); 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.putString("importantVariable", variablesCreatedByStep1); 
      editor.commit(); 

      //...other things 
    } 
} 

當我輸入這個時,我理解這種數據交換甚至不應該發生在第一位。重新思考在MyClass.onCreate到MyPluginClass移動代碼,兩個問題浮現在腦海中:

  1. 我還可以使用一個構造函數,或稱爲一次只相當於,因爲我想這個代碼只執行一次,在初始化(也許pluginInitialize()?)
  2. 如果是的話,我該怎麼做相當於:context.getExternalFilesDir(null);

這使我想起我真正想問的問題。爲什麼

cordova.getActivity() 

失敗,在Cordova插件構造函數中出現空指針異常?

回答

0

我不確定Java中的構造函數初始化機制,但afaik,cordova插件實例是靜態實例,您可能無法確保CordovaActivity已經在插件ctor之前被初始化。你可以通過很容易調試來檢查它。

我寧願添加一個init方法到插件類。你甚至可以從你的execute()函數中獲取共享存儲器中的變量(代碼在你的插件ctor中)。我認爲你有幾種選擇。

+0

「我寧願添加一個init方法的插件類。」是關鍵。 http://cordova.apache.org/docs/en/3.1.0/guide_platforms_android_plugin.md.html談到「插件應該使用initialize方法來啓動它們的啓動邏輯。public void initialize(CordovaInterface cordova,CordovaWebView webView)」 。這就是爲什麼在任何插件中都沒有構造函數的原因。奇怪的是,當你有答案時(但不是在此之前),文件似乎突然變得最新且充分。 – user1178768 2014-08-28 08:38:10

0

我習慣是:

Context context = this.cordova.getActivity().getApplicationContext(); 
SharedPreferences preferences = context.getSharedPreferences("mystring", Context.MODE_PRIVATE); 
相關問題