studio example codigo based app java android sockets android-webview listener

java - example - Acceso a WebView desde otra función en la clase MainActivity



webview android studio 2018 (2)

¿Cómo acceder correctamente a la variable "ver" en la función onCreate ? Quiero loadUrl() pero arroja un error en línea con public Emitter.Listener onServerReceive = new Emitter.Listener() { on 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 + "'')"); } }); } }; }

¿Qué hago mal, cómo solucionarlo? ¡Gracias!


Está intentando usar la view antes de que se haya inicializado. view = (WebView) findViewById(R.id.webView); esperar hasta después de view = (WebView) findViewById(R.id.webView); ha sido llamado para inicializar onServerReceive .

EDITAR: Viendo esto algo más, lo más probable es que estés usando tu instancia de onServerRecieve antes de que la view se inicialice en 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; }


Finalmente encontré la respuesta y el problema

Tenía esto

view.addJavascriptInterface(new MainActivity(), "access_android");

y en web js "access_android.websocket_emit()" a Android con este "access_android.websocket_emit()"

y creo que debido a "new MainActivity()" estaba creando una nueva clase donde "view" no estaba definido. así que reemplacé "new MainActivity()" con "this"

view.addJavascriptInterface(this, "access_android");

ahora todo funciona bien! Gracias, adiós