因此,我看到的例子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移動代碼,兩個問題浮現在腦海中:
- 我還可以使用一個構造函數,或稱爲一次只相當於,因爲我想這個代碼只執行一次,在初始化(也許pluginInitialize()?)
- 如果是的話,我該怎麼做相當於:context.getExternalFilesDir(null);
這使我想起我真正想問的問題。爲什麼
cordova.getActivity()
失敗,在Cordova插件構造函數中出現空指針異常?
「我寧願添加一個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