如何正确访问onCreate
函数中的"view"变量?我想要,loadUrl()
但它会抛出一个错误,public Emitter.Listener onServerReceive = new Emitter.Listener() {
在view = loadUrl
:
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at com.myapp.MainActivity$7$1.run(MainActivity.java:399) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:177) at android.app.ActivityThread.main(ActivityThread.java:4947) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) at dalvik.system.NativeStart.main(Native Method)
import com.github.nkzawa.emitter.Emitter; .... public class MainActivity extends Activity { WebView view; Socket mSocket; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... view = (WebView) findViewById(R.id.webView); view.getSettings().setJavaScriptEnabled(true); ... view.loadUrl("file:///android_asset/loading.html"); } ... @JavascriptInterface public void websocket_start(){ try { mSocket = IO.socket("http://some web com:8888"); mSocket.on("connect", onConnect); mSocket.on("server_receive", onServerReceive); mSocket.connect(); } catch (URISyntaxException e) {} } public Emitter.Listener onConnect = new Emitter.Listener() { @Override public void call(final Object... args) { runOnUiThread(new Runnable() { @Override public void run() { JSONObject jsonRootObject = new JSONObject(); try { jsonRootObject = new JSONObject("{ pn: " + global_login + ", pp: " + global_pass + " }"); } catch (JSONException e) { throw new RuntimeException(e); } mSocket.emit("Auth", jsonRootObject); } }); } }; public Emitter.Listener onServerReceive = new Emitter.Listener() { @Override public void call(final Object... args) { runOnUiThread(new Runnable() { @Override public void run() { final String argsStr = TextUtils.join(",", args); PROBLEM HERE "view" is null -> view.loadUrl("javascript:receive('" + argsStr + "')"); } }); } }; }
我做错了什么,如何解决?谢谢!
您在view
初始化之前尝试使用.你需要等到view = (WebView) findViewById(R.id.webView);
调用之后再进行初始化onServerReceive
.
编辑:再看看这个更可能发生的是你正在使用你的实例onServerRecieve
之前view
的初始化onCreate()
.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... view = (WebView) findViewById(R.id.webView); onServerRecieve = createListener() view.getSettings().setJavaScriptEnabled(true); ... view.loadUrl("file:///android_asset/loading.html"); } ... @JavascriptInterface public void websocket_start(){ try { mSocket = IO.socket("http://some web com:8888"); mSocket.on("connect", onConnect); mSocket.on("server_receive", onServerReceive); mSocket.connect(); } catch (URISyntaxException e) {} } private Emitter.Listener createListener() { return new Emitter.Listener() { @Override public void call(final Object... args) { runOnUiThread(new Runnable() { @Override public void run() { final String argsStr = TextUtils.join(",", args); view.loadUrl("javascript:receive('" + argsStr + "')"); } }); } }; } public Emitter.Listener onServerReceive; }
终于找到了答案和问题
我有这个
view.addJavascriptInterface(new MainActivity(), "access_android");
在web js我用这个访问了android "access_android.websocket_emit()"
我认为因为"new MainActivity()"
它创建了一个新的类,其中"视图"没有定义.所以我换成"new MainActivity()"
了"this"
view.addJavascriptInterface(this, "access_android");
现在一切正常!谢谢你再见