2015-12-13 47 views
27

Jak poprawnie uzyskać dostęp do zmiennej "view" w funkcji onCreate? Chcę loadUrl() ale zgłasza błąd na linii z, public Emitter.Listener onServerReceive = new Emitter.Listener() { na view = loadUrl:Dostęp do WebView z innej funkcji klasy 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 + "')"); 
       } 
      }); 
     } 
    }; 

} 

Co robię nie tak, jak to naprawić? dzięki!

+0

Wydaje się prawdopodobne, że chcesz użyć OnCreateView(), a nie OnCreate(). Widok, którego szukasz prawdopodobnie jeszcze nie został zawyżony w OnCreate(). – alzee

+0

Czy masz jakiś kod, który przypisuje 'null' do' view'? Poza tym używasz 'onServerReceive' w jakikolwiek inny sposób? – cybersam

+1

Czy mógłbyś opublikować swój pełny kod? –

Odpowiedz

13

Wreszcie znalazłem odpowiedź i problem

miałem ten

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

aw js internetowych ja obejrzano androida z tym "access_android.websocket_emit()"

i myślę, że z powodu "new MainActivity()" było tworzenie nowej klasy, w której "widok" nie został zdefiniowany. więc wymieniłem "new MainActivity()" z "this"

view.addJavascriptInterface(this, "access_android"); 

teraz wszystko działa bez zarzutu! dzięki do widzenia

+4

nie mogliśmy na to odpowiedzieć, ponieważ nie wiedzieliśmy, że to robisz! lol Chciałem bounty! * sniff * –

+1

Tworzenie aktywności za pomocą "nowego" jest bezcelowe i szkodliwe. –

15

Próbujesz użyć view, zanim zostanie zainicjalizowany. Musisz poczekać, aż po wywołaniu view = (WebView) findViewById(R.id.webView); zostanie wywołana onServerReceive.

EDYCJA: Patrząc na to więcej, bardziej prawdopodobne jest to, że używasz instancji onServerRecieve, zanim view zostanie zainicjowane w .

@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

Przepraszam, zapomniałem powiedzieć, że mam ten sam Emitter.Listener dla onConnect, a teraz one się kłócą, a onConnect nigdy nie zostaje wyrzucony. Edytowałem pierwszy wpis. – waza123

+0

Czy możesz umieścić więcej kodu, nie jest jasne, w jaki sposób używasz 'Emitter.Listener's, jednak jestem pewien, że problem polega na tym, że' call() 'jest wykonywane przed zainicjowaniem' view'. –

+0

nie ma więcej kodu, to wszystko, wszystkie inne funkcje nie są powiązane z obiektem "widok" lub obiektem mSocket. Czy możesz pokazać, jak używać tych dwóch Emitter.Listener razem? – waza123