PhoneGap使用CordovaWebView時注意事項

在使用PhoneGap的CordovaWebView做界面渲染的時候使用插件的時候報這麼一個異常

E/AndroidRuntime(543): java.lang.NullPointerException
10-31 13:02:16.075: E/AndroidRuntime(543):  at org.apache.cordova.api.Plugin.execute(Plugin.java:74)
10-31 13:02:16.075: E/AndroidRuntime(543):  at org.apache.cordova.api.CordovaPlugin.execute(CordovaPlugin.java:61)
10-31 13:02:16.075: E/AndroidRuntime(543):  at org.apache.cordova.api.PluginManager.exec(PluginManager.java:224)

從異常情況來看異常產生在插件這塊。根據官方文檔描述來看,使用CordovaWebView方式時,需要繼承Activiti並實現org.apache.cordova.api.CordovaInterface接口。並實現以下三個方法,否則會報空指針異常

@Override
public Activity getActivity() {
	return this;
}

@Override
public Context getContext() {
	return this.getContext();
}

@Override
public ExecutorService getThreadPool() {
	return threadPool;
}

這裏需要注意的是public ExecutorService getThreadPool()這個方法。該方法實際上是

private final ExecutorService threadPool =Executors.newCachedThreadPool();


若不實現該方法那麼在使用插件的時候會報如上文所示的異常

http://stackoverflow.com/questions/13194537/android-phonegap-2-1-2-2-upgrade-error


完整的代碼如下

package com.demo1;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.cordova.CordovaWebView;
import org.apache.cordova.api.CordovaInterface;
import org.apache.cordova.api.CordovaPlugin;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

public class Demo1Activity extends Activity implements CordovaInterface{
	
    CordovaWebView cordovaWebView;
	
    private final ExecutorService threadPool =Executors.newCachedThreadPool();
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.main);
        
        cordovaWebView=(CordovaWebView) findViewById(R.id.tutorialView);
        
        cordovaWebView.loadUrl("file:///android_asset/www/index.html");
    }

	@Override
	public void cancelLoadUrl() {
		
	}

	@Override
	public Activity getActivity() {
		return this;
	}

	@Override
	public Context getContext() {
		return this.getContext();
	}

	@Override
	public ExecutorService getThreadPool() {
		return threadPool;
	}

	@Override
	public Object onMessage(String string, Object object) {
		return null;
	}

	@Override
	public void setActivityResultCallback(CordovaPlugin cordovaPlugin) {
		
	}

	@Override
	public void startActivityForResult(CordovaPlugin plugin, Intent intent, int i) {
		
	}      
}

最後上一個模擬器上的效果圖:








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章