標籤:
以下是個人拙見,大神可直接忽略。
直接奔入主題,android的一個webview控制項相信大家都特別熟悉了,可以用來載入顯示網頁,像商城的商品圖文詳情就可以用網頁很快實現,但是最近項目中遇到不一樣的問題,商品首頁用webview顯示,點擊某一個商品或者商品分類startactivity跳轉自身的介面,首頁混雜一部分網頁載入肯定會遇到介面顯示卡頓,顯示慢的問題,不過既然需求是這樣,也只能照做了。
顯示一個網頁就不說了,首先,先最佳化一下顯示速度問題,也就是顯示文字和圖片的先後,在oncreate方法加上下面代碼:
if (Build.VERSION.SDK_INT >= 19) { mWebView.getSettings().setLoadsImagesAutomatically(true); } else { mWebView.getSettings().setLoadsImagesAutomatically(false); }
在WebViewClient中的onPageFinished方法加入:
if (!mWebView.getSettings().getLoadsImagesAutomatically()) { mWebView.getSettings().setLoadsImagesAutomatically(true); }
由於可能導致網頁顯示錯誤,如果想自訂,在onReceivedError方法中載入自己在本地寫的html.
其次就是要實現startActivity點擊跳轉android介面了,下面兩句話極其重要:
mWebView.getSettings().setJavaScriptEnabled(true);mWebView.addJavascriptInterface(new WebAppInterface(MyWebShopActivity.this), "startActivity");
讓你的webview支援頁面js互動,其中"startActivity" 可以更改,和網頁js方法保持一致就行了,然後寫入你要點擊實現的效果了,要顯示一句話,或者跳轉介面等...
public class WebAppInterface { Context mContext; WebAppInterface(Context c) { mContext = c; } @JavascriptInterface public void jump_product_detail(final String id) { //TODO 處理代碼 } }
我這裡就是下的跳轉點擊的商品,"jump_product_detail"和上面的"startActivity"一樣可以更改,也要保持一致。
最後,在你自訂處理代碼中說一下可能遇到的問題,前端在做網頁的時候會加上每一個點擊的id,也就是標識,比如你載入時url是"https://www.baidu.com/" , 點擊後會變為"https://www.baidu.com/:01" 這樣多了id的url,可是這時webview會載入一次這個url,但是這個url是不存在的,所以我們就要重新載入一次原來的URL,注意這裡不能用mWebView.loadUrl(url)來載入了,看下面的log輸出就知道了:
java.lang.Throwable: Warning: A WebView method was called on thread ‘WebViewCoreThread‘. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads.
處理方法就是改為:
mWebView.post(new Runnable() { @Override public void run() { mWebView.loadUrl(url); //url為初始的值 }});
代替mWebView.loadUrl(url)來載入。
同樣,在你用startActivity啟動介面時會出現錯誤Uncaught Error: Error calling method on NPObject,只需要修改為:
Handler mHandler = new Handler(); mHandler.post(new Runnable() { @Override public void run() { startActivity(new Intent(action, uri)); });
就能較好的解決以上兩個容易出現的問題了。
ok, 先這樣,還有什麼問題想知道的可以在下方評論。
Android使用Webview顯示頁面以及點擊跳轉StartActivity問題