从 MainActivity 中的另一个函数访问 WebView class
Access to WebView from another function in MainActivity class
如何正确访问 onCreate
函数中的 "view" 变量?我想要 loadUrl()
但它会在 public Emitter.Listener onServerReceive = new Emitter.Listener() {
on view = loadUrl
上引发错误:
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException
at com.myapp.MainActivity.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
.
编辑:再看看这个,更有可能发生的是,在 onCreate()
中初始化 view
之前,您正在使用 onServerRecieve
的实例。
@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 中,我使用 "access_android.websocket_emit()"
访问了 android
我认为是因为 "new MainActivity()"
它正在创建一个新的 class,其中 "view" 未定义。所以我用 "this"
替换了 "new MainActivity()"
view.addJavascriptInterface(this, "access_android");
现在一切正常!
谢谢 再见
如何正确访问 onCreate
函数中的 "view" 变量?我想要 loadUrl()
但它会在 public Emitter.Listener onServerReceive = new Emitter.Listener() {
on view = loadUrl
上引发错误:
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at com.myapp.MainActivity.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
.
编辑:再看看这个,更有可能发生的是,在 onCreate()
中初始化 view
之前,您正在使用 onServerRecieve
的实例。
@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 中,我使用 "access_android.websocket_emit()"
我认为是因为 "new MainActivity()"
它正在创建一个新的 class,其中 "view" 未定义。所以我用 "this"
"new MainActivity()"
view.addJavascriptInterface(this, "access_android");
现在一切正常! 谢谢 再见