2015-12-13 67 views
27

Come accedere correttamente alla variabile "view" nella funzione onCreate? Voglio loadUrl() ma genera un errore sulla linea con, public Emitter.Listener onServerReceive = new Emitter.Listener() { sul view = loadUrl:Accesso a WebView da un'altra funzione nella classe MainActivity

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 + "')"); 
       } 
      }); 
     } 
    }; 

} 

Che cosa ho fatto di sbagliato, come rimediare? Grazie!

+0

Sembra probabile che tu voglia utilizzare OnCreateView(), non OnCreate(). La vista che stai cercando probabilmente non è stata ancora gonfiata nell'OnCreate(). – alzee

+0

Hai qualche codice che assegna 'null' a' view'? Inoltre, stai usando 'onServerReceive' in un altro modo? – cybersam

+1

Potresti pubblicare il tuo codice completo? –

risposta

13

finalmente trovato la risposta e il problema

ho avuto questa

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

e js web che l'accesso ad Android con questo "access_android.websocket_emit()"

e penso a causa di "new MainActivity()" era creando una nuova classe in cui "vista" non è stata definita. così ho sostituito con "new MainActivity()""this"

view.addJavascriptInterface(this, "access_android"); 

ora tutto funziona benissimo! grazie arrivederci

+4

non siamo riusciti a rispondere, perché non sapevamo che lo stavi facendo! lol volevo la taglia! * sniff * –

+1

La creazione di attività tramite "nuovo" è inutile e dannosa. –

15

Si sta tentando di utilizzare view prima che sia stato inizializzato. È necessario attendere fino al momento in cui è stato chiamato view = (WebView) findViewById(R.id.webView); per inizializzare onServerReceive.

EDIT: Guardando a questo un po 'di quello che sta accadendo più probabile è che si sta utilizzando l'istanza di onServerRecieve prima view viene inizializzato in 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; 

} 
+0

scusa ho dimenticato di dire che ho lo stesso Emitter.Listener per onConnect, e ora sono in conflitto e onConnect non viene mai attivato. Ho modificato il primo post. – waza123

+0

Puoi pubblicare un altro codice, non è chiaro come stai usando 'Emitter.Listener's, tuttavia sono sicuro che il problema è' call() 'è in esecuzione prima che' view' sia inizializzato. –

+0

non c'è più codice, è tutto, tutte le altre funzioni non sono correlate all'oggetto "vista" o all'oggetto mSocket. Puoi solo mostrare come usare questi due Emitter.Listener insieme? – waza123