2016-03-25 2 views
0

Ich versuche, einige einfache App basierend auf WebView zu entwickeln, und ermöglichen den Austausch von Daten zwischen Android-App und Remote-Seite.Zugriff auf von OnCreate von außen deklariertes Webview?

Problembeschreibung:

loadURL arbeitet innerhalb onCreate, aber nicht von außen onCreate arbeiten. Bitte beachten Sie folgenden Code und erklären, was ich falsch gemacht, warum es nicht funktioniert innerhalb WebAppInterface Klasse:

public class MainActivity extends Activity { 
    public WebView view1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     String url = "htxx://mydomain.com/"; 
     final WebView view1 =(WebView) this.findViewById(R.id.webView); 
     view1.addJavascriptInterface(new WebAppInterface(this), "Android"); //exchange between web-js and webview 
     WebSettings webSettings = view1.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     view1.loadUrl(url); 
     view1.setWebViewClient(new com.example.project.MyAppWebViewClient() { 
      @Override 
      public void onPageFinished(WebView view1, String url) { 
       findViewById(R.id.progressBar1).setVisibility(View.GONE); 
       findViewById(R.id.webView).setVisibility(View.VISIBLE); 
      } 
     }); 
     view1.setInitialScale(100); 

     ///// ---> That's works: 
     view1.setWebViewClient(new WebViewClient() { 
      public void onPageFinished(WebView view, String url) { 
       view1.loadUrl("javascript:somescript('Page is loaded')"); 
      } 
     }); 

     ///// ---> That's works too: 
     Button btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
       String device_id = tm.getDeviceId(); 
       view1.loadUrl("javascript:somescript('"+device_id+"')"); 
      } 
     }); 
    } 

    public class WebAppInterface { 
     Context mContext; 
     WebAppInterface(Context c) { 
      mContext = c; 
     } 

     @JavascriptInterface 
     public void showToast(String toast) { 
      //show toast from web-app (js to android) 
      Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
     } 

     @JavascriptInterface 
     public void printFromWeb() { 
      //show toast from web-app (js to android) 

      ///// ---> That's NOT working :(
      view1.loadUrl("javascript:somescript('Checking loadurl from outside of onCreate')"); 
     } 
    } 
} 

Interessant, dass keine Fehler in Android Studio auftritt.

Antwort

2

Sie haben public WebView view1; als ein Feld und ganz andere endgültige view1 innen onCreate(), so ist es tatsächlich null in Ihrer public void printFromWeb() Methode.


ist der sichere Weg zu gehen:

WebView Für den Zugriff auf "von außen", ein privates Feld von WebView-Klasse hinzufügen:

private WebView webView; 

In Ihrer onCreate() Methode instanziiert es:

webView = (WebView) findViewById(R.id.webView); 

eine Getter-Methode Fügen Sie die Instanz zugreifen:

Und denken Sie daran, nur auf UI-Thread nur zu berühren.


Update: Wie sicher Ansichten für den Zugriff auf von nicht-ui thread:

MainActivity.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run(){ 
     view1.loadUrl(...) 
    } 
}) 
+0

Vielen Dank, jetzt ist es Arbeit! Aber ich verstehe Ihre letzte Empfehlung nicht, und ich bekomme die gleiche (wie Sie beschrieben haben) Nachricht in logcat: _Warnung: Eine WebView-Methode wurde im Thread 'WebViewCoreThread' aufgerufen. Alle WebView-Methoden müssen im UI-Thread aufgerufen werden. Zukünftige Versionen von WebView unterstützen möglicherweise die Verwendung in anderen Threads nicht. _ – deeplay

+1

@deeplay, das Problem besteht darin, dass das Aufrufen der Methode beim Anzeigen von Nachkommen aus dem externen UI-Thread die Regel unterbricht _ "nicht auf das UI-Toolkit von außerhalb des UI-Threads zugreifen" _. [http://nickthecoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-android](Here) ist ein Artikel, der es klarer machen sollte. Unterdessen aktualisiere ich meinen Beitrag mit dem relevanten Ausschnitt – xAF

+0

_ [OOPS! DIESE SEITE KANN NICHT GEFUNDEN WERDEN.] (Https://nicktcoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-androi%E2%80%8C%E2%80% 8Bd) _ – deeplay