Beberapa pertimbangan untuk WebView selepas Android 4.4


Pengenalan kepada bahagian ini:

Rujukan kepada teks asal bahagian ini: Langkah berjaga-jaga untuk menggunakan WebView dalam Android 4.4.md

Bermula daripada Android 4.4, WebView dalam Android tidak lagi berdasarkan WebKit, tetapi mula berdasarkan Chromium Perubahan ini Prestasi WebView telah dipertingkatkan dengan baik, dan ia mempunyai sokongan yang lebih baik untuk HTML5, CSS dan JavaScript!

Walaupun kromium telah menggantikan sepenuhnya WebKit sebelumnya untuk Android, antara muka API Android WebView tidak berubah. Serasi sepenuhnya dengan versi lama. Kelebihan ini ialah APP yang dibina berdasarkan WebView tidak memerlukan sebarang pengubahsuaian. Anda boleh menikmati kecekapan dan kuasa teras kromium.

Untuk WebView selepas 4.4, kami perlu memberi perhatian kepada isu berikut:


1 Berbilang benang

Jika anda dalam urutan kanak-kanak Jika anda memanggil kaedah WebView yang berkaitan dalam urutan UI dan bukannya urutan UI, ralat yang tidak dapat diramalkan mungkin berlaku. Oleh itu, apabila anda perlu menggunakan multi-threading dalam program anda, sila gunakan juga kaedah runOnUiThread() untuk memastikan anda Operasi WebView dilakukan dalam urutan UI:

runOnUiThread(newRunnable(){
@Override
publicvoid run(){
   // Code for WebView goes here
   }
});

2. Menyekat benang

Jangan sekali-kali menyekat urutan UI, ini adalah salah satu langkah pertama dalam membangunkan Kebenaran program Android. Walaupun ia adalah kebenaran, kita sering tidak menyedarinya Buat beberapa kesilapan yang melanggarnya. Kesilapan biasa yang dibuat dalam pembangunan sedang menunggu panggilan balik JavaScript dalam urutan UI. Contohnya:

// This code is BAD and will block the UI thread
webView.loadUrl("javascript:fn()"); 
while(result ==null) {  
    Thread.sleep(100); 
}

Jangan lakukan ini Android 4.4 menyediakan API baharu untuk melakukan ini. evaluateJavascript() direka khusus untuk melaksanakan kod JavaScript secara tidak segerak.


3.evaluateJavascript() kaedah

digunakan khas untuk memanggil kaedah JavaScript secara tidak segerak dan boleh mendapatkan hasil panggilan balik.

Contoh:

mWebView.evaluateJavascript(script, new ValueCallback() {
 @Override
 public void onReceiveValue(String value) {
      //TODO
 }
});

4. Kendalikan lompatan url dalam WebView

Versi baharu WebView. adalah untuk penyesuaian Skim lompatan URL mempunyai sekatan baharu yang lebih ketat. Apabila anda melaksanakan panggilan balik shouldOverrideUrlLoading() atau shouldInterceptRequest(), WebView hanya akan melompat apabila URL lompat ialah URL yang sah. Contohnya, jika anda menggunakan url seperti ini:

Show Profile

shouldOverrideUrlLoading() tidak akan dipanggil.

Cara yang betul untuk menggunakannya ialah:

Show Profile

Cara yang sepadan untuk mengesan lompatan Url:

// The URL scheme should be non-hierarchical (no trailing slashes)
 privatestaticfinalString APP_SCHEME ="example-app:";
 @Override 
 publicboolean shouldOverrideUrlLoading(WebView view,String url){
     if(url.startsWith(APP_SCHEME)){
         urlData =URLDecoder.decode(url.substring(APP_SCHEME.length()),"UTF-8");
         respondToData(urlData);
         returntrue;
     }
     returnfalse;
}

Sudah tentu, ia juga boleh digunakan seperti ini:

webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,null,"UTF-8",null);

5.UserAgent berubah

Jika program pelayan yang sepadan dengan Apl anda akan melakukan perkara yang berbeza berdasarkan UserAgent yang dihantar daripada klien, maka anda perlu memberi perhatian Apa yang menarik ialah dalam versi baharu WebView, UserAgent telah mengalami beberapa perubahan halus:

Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16H)
AppleWebKit/537.36(KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0
Mobile Safari/537.36

Gunakan kaedah getDefaultUserAgent() untuk mendapatkan UserAgent lalai, atau anda boleh lulus:

mWebView.getSettings().setUserAgentString(ua);
mWebView.getSettings().getUserAgentString();

untuk menetapkan dan mendapatkan UserAgent tersuai.


6. Nota tentang penggunaan addJavascriptInterface()

Bermula daripada Android 4.2. Hanya kaedah Java yang diisytiharkan dengan @JavascriptInterface boleh dipanggil oleh JavaScript. Contohnya:

class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
}

webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");

7. Penyahpepijatan Jauh

1.png

Versi baharu WebView juga menyediakan fungsi yang sangat berkuasa: gunakan Chrome untuk nyahpepijat atur cara anda berjalan dalam WebView Untuk butiran, sila lihat: penyahpepijat jauhPS: Anda memerlukan tangga~ Anda juga boleh terus nyahpepijat jauh Baidu untuk mengetahui tentang maklumat yang berkaitan dan cara menggunakannya!


Penyelesaian kepada masalah N5 membaca kenalan di bahagian sebelumnya:

Hei, selepas membaca perkara di atas, kita tahu bahawa selepas Android 4.2, hanya Tambah @JavascriptInterface Hanya kaedah Java yang diisytiharkan boleh dipanggil oleh JavaScript, jadi kami menambah @JavascriptInterface

2.png

kepada dua kaedah sebelumnya, namun, selepas menambahkannya, tiada As we dijangka, senarai kenalan yang kami mahukan muncul. Dengan melihat Log, kami menemui sekeping maklumat berikut:

5.png

Maksud umum ialah: semua kaedah WebView harus dipanggil dalam urutan yang sama, tetapi kaedah senarai kenalan di sini wujud Telah dipanggil dalam benang JavaBridge! Jadi kita perlu menulis bahan dalam senarai kenalan ke dalam urutan yang sama, seperti penyelesaian Kaedahnya adalah seperti berikut:

3.png

Hei, mari jalankan program dan secara ajaib mendapati kenalan telefon bimbit N5 kami boleh dibaca~

4.png

Begitu juga, contoh pertama sebelum ini juga boleh diselesaikan dengan cara ini~


Ringkasan bahagian ini:

Ikuti semua orang dalam bahagian ini Perjalanan ke perkara yang perlu diberi perhatian dalam WebView selepas Android 4.4, serta beberapa jawapan kepada isu N5 dalam bahagian sebelumnya Penyelesaiannya ~ Saya percaya ia akan membawa kemudahan kepada semua orang dalam menggunakan WebView dalam pembangunan sebenar ~ Terima kasih