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

¿Cómo acceder correctamente a la variable "view" 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 arreglarlo? ¡Gracias!

Está intentando utilizar la view antes de que se haya inicializado. Necesita esperar hasta que after view = (WebView) findViewById(R.id.webView); Ha sido llamado con el fin de inicializar onServerReceive .

EDIT: Mirando esto un poco más lo que es más probable que suceda es que está utilizando su instancia de onServerRecieve antes de que la view se inicializa 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

Yo tuve 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 substituí "new MainActivity()" con "this"

 view.addJavascriptInterface(this, "access_android"); 

Ahora todo funciona bien! Gracias, adiós

  • ¿Cómo puedo cerrar BluetoothSocket en la rotación de la pantalla en Android?
  • UDP Multicasting desde el móvil a la PC
  • Reenvío de puertos Android
  • Llegar a un dispositivo de red por IP y puerto mediante el emulador de Android
  • Android socket de programación ... ¿qué da?
  • ¿Cómo puedo manejar múltiples clientes conectados a un servidor mediante sockets?
  • Android: ¿Cómo detectar la aplicación eliminada de la lista de aplicaciones recientes?
  • Socket de transferencia de una actividad a otra
  • Conexión de dos teléfonos Android para transferir datos entre ellos a través de WIFI
  • AsyncTask, doInBackground nunca se ejecuta en android
  • ¿Cómo mantener el cliente android conectado al servidor incluso en los cambios de actividad y enviar datos al servidor?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.