亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android WebView上實(shí)現(xiàn)JavaScript與Java交互

 更新時(shí)間:2016年03月17日 10:45:24   作者:集君  
這篇文章主要介紹了Android WebView上實(shí)現(xiàn)JavaScript與Java交互 的相關(guān)資料,需要的朋友可以參考下

其實(shí)webview加載資源的速度并不慢,但是如果資源多了,當(dāng)然就很慢。圖片、css 、js 、html這些資源每個(gè)大概需要10-200ms ,一般都是30ms就ok了。不過webview是必須等到全部資源都完成加載,才會(huì)進(jìn)行渲染的,所以加載的速度很重要!從Google上我們了解到,webview加載頁面的順序是:先加載html,然后從里面解析出css、js文件和頁面上的圖片資源進(jìn)行加載。如果webkit的緩存里面有,就不加載。加載完這些資源之后,就進(jìn)行css的渲染和js的執(zhí)行。Css的渲染一般不需要很長時(shí)間,幾十毫秒就ok。關(guān)鍵是js的執(zhí)行,如果用了jQuery,則執(zhí)行起來需要5-6秒。而在這段時(shí)間,如果不在webview里設(shè)置背景,網(wǎng)頁部分是白色的,很難看。這是一個(gè)很糟糕的用戶體驗(yàn)。所以#歐#柏泰#克建議如果用網(wǎng)頁布局程序,最好別用那些龐大的js框架。最好使用原生的js寫業(yè)務(wù)腳本,以提升加載速度,改善用戶體驗(yàn)。

在混合開發(fā)中,有時(shí)會(huì)用到安卓原生SDK,如調(diào)用相機(jī)、查看相冊(cè)、錄音等,這就需要web頁面中的JavaScript能調(diào)用到安卓SDK接口。由于Android的WebView是基于webkit內(nèi)核的,集成了js與java互調(diào)的接口函數(shù),可以方便地進(jìn)行開發(fā)使用。

界面布局xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<WebView
android:id="@+id/webView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/linearLayout"
/>
<LinearLayout 
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Java調(diào)用JavaScript接口"
>
</Button>
</LinearLayout>
</RelativeLayout> 

java代碼:

private WebView webView;
private Handler handler = new Handler();
private Button button;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
//自定義webView設(shè)置
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavaScriptInterface(MainActivity.this), "javaInterface");
//如果注釋了,javaScript中的alert彈窗等就會(huì)失效,不顯示
webView.setWebChromeClient(new WebChromeClient());
//webView.setWebChromeClient(new MyWebChromeClient());
//測(cè)試webView加載是否正常
//webView.loadUrl("http://www.baidu.com/");
webView.setWebViewClient(new HelloWebView());
webView.loadUrl("file:///android_asset/index.html");
button = (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String param = "bb";
webView.loadUrl("javascript:showTitle('"+param+"')");
}
});
}
private class HelloWebView extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;
} 
}
/**
* 在主線程中定義JavaScript可以調(diào)用的安卓接口
* @author CHQ
* API 以后,每個(gè)被調(diào)用java函數(shù)都要叫聲明 @JavascriptInterface
*/
public class MyJavaScriptInterface{
private Context context;
public MyJavaScriptInterface(Context context){
this.context = context;
}
@JavascriptInterface
public String toString() {
return "this is interface";
}
@JavascriptInterface
public void clickOnAndroid() {
Toast.makeText(context, "js調(diào)用安卓:....", Toast.LENGTH_SHORT).show();
}
/**
* 安卓調(diào)用JS接口,要開啟子線程調(diào)用
*/
@JavascriptInterface
public void call() {
Toast.makeText(context, "安卓客戶端再調(diào)用JavaScript接口", Toast.LENGTH_SHORT).show();
handler.post(new Runnable() { 
@Override
public void run() {
String param = "bb";
webView.loadUrl("javascript:showTitle('"+param+"')");
}
});
}
}

其中:有幾點(diǎn)必須注意的,網(wǎng)上早期關(guān)于WebView的描述中,有幾點(diǎn)變化。1)安卓4.2以上的版本中使用WebView實(shí)現(xiàn)Java與Js互調(diào),java接口需要聲明@JavascriptInterface ; 2)WebView要調(diào)用setWebChromeClient(),以適應(yīng)Js等彈窗等實(shí)現(xiàn);3)addJavascriptInterface中綁定的接口中調(diào)用JavaScript接口,需要開啟子線程來調(diào)用(報(bào)錯(cuò):Caused by: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. );

HTML代碼:

<html>
<script type="text/javascript">
//安卓定義的接口1
function callAndroidInterface() {
window.javaInterface.clickOnAndroid();
}
//
function showTitle(param) {
alert("傳參:"+param);
var x = document.getElementById("title");
alert("標(biāo)題:"+x.innerHTML);
}
</script>
<body>
<h3 id="title">關(guān)于安卓與JavaScript的交互</h3>
<input type="button" value="調(diào)用接口1" onclick="callAndroidInterface()"></input> 
<input type="button" value="測(cè)試接口可用性" onclick="showTitle('aa')"></input> 
<input type="button" value="調(diào)用接口2" onclick="window.javaInterface.call()"></input>
</body>
</html> 

以上html文件,其中javaInterface就是webView中addJavacriptInterface()方法中注入的接口入口名稱,通過該名稱就可以直接調(diào)用Java中的接口。(該html頁面需要保持到項(xiàng)目assets目錄中,由webView.loadUrl("file:///android_asset/index.html")來加載);

效果圖:

其中,對(duì)話框彈出:網(wǎng)址為"file://"的網(wǎng)頁顯示:,如果是服務(wù)器上的web頁面就會(huì)顯示源IP地址等等,顯然不是我們想要的。下一篇,我們可以重寫WebChromeClient來修改對(duì)話框、確認(rèn)框等webView的優(yōu)化。

以上內(nèi)容是針對(duì)Android WebView上實(shí)現(xiàn)JavaScript與Java交互的全部內(nèi)容,希望對(duì)大家有所幫助!

相關(guān)文章

  • Android編程設(shè)置屏幕亮度的方法

    Android編程設(shè)置屏幕亮度的方法

    這篇文章主要介紹了Android編程設(shè)置屏幕亮度的方法,結(jié)合實(shí)例形式分析了Android獲取及設(shè)置屏幕亮度的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • Android實(shí)現(xiàn)錄音方法(仿微信語音、麥克風(fēng)錄音、發(fā)送語音、解決5.0以上BUG)

    Android實(shí)現(xiàn)錄音方法(仿微信語音、麥克風(fēng)錄音、發(fā)送語音、解決5.0以上BUG)

    大家平時(shí)在使用微信qq聊天時(shí)經(jīng)常會(huì)發(fā)送語音功能,今天小編給大家?guī)砹嘶赼ndroid實(shí)現(xiàn)錄音的方法仿微信語音、麥克風(fēng)錄音、發(fā)送語音、解決5.0以上BUG,需要的朋友參考下吧
    2018-04-04
  • Android Studio中Run按鈕是灰色的快速解決方法

    Android Studio中Run按鈕是灰色的快速解決方法

    這篇文章主要介紹了Android Studio中Run按鈕是灰色的快速解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-03-03
  • Android客戶端實(shí)現(xiàn)注冊(cè)、登錄詳解(2)

    Android客戶端實(shí)現(xiàn)注冊(cè)、登錄詳解(2)

    這篇文章主要為大家詳細(xì)介紹了Android客戶端實(shí)現(xiàn)注冊(cè)、登錄代碼第二篇,App與服務(wù)器的交互實(shí)現(xiàn)登錄和自動(dòng)登錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Flutter UI實(shí)現(xiàn)側(cè)拉抽屜菜單

    Flutter UI實(shí)現(xiàn)側(cè)拉抽屜菜單

    這篇文章主要為大家詳細(xì)介紹了Flutter UI實(shí)現(xiàn)側(cè)拉抽屜菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • uniapp打包Android的apk(原生APP-云打包)及發(fā)布測(cè)試全過程

    uniapp打包Android的apk(原生APP-云打包)及發(fā)布測(cè)試全過程

    uni-app本地打包apk需要提前做非常多的準(zhǔn)備工作,而且可能會(huì)勸退一些開發(fā)者,下面這篇文章主要給大家介紹了關(guān)于uniapp打包Android的apk(原生APP-云打包)及發(fā)布測(cè)試的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Android菜單操作之創(chuàng)建并響應(yīng)菜單

    Android菜單操作之創(chuàng)建并響應(yīng)菜單

    這篇文章主要介紹了Android菜單操作之創(chuàng)建并響應(yīng)菜單的相關(guān)資料,如何使用代碼創(chuàng)建菜單項(xiàng),給菜單項(xiàng)分組,及各種響應(yīng)菜單事件的方法,需要的朋友可以參考下
    2016-04-04
  • 使用Kotlin開發(fā)Android應(yīng)用教程

    使用Kotlin開發(fā)Android應(yīng)用教程

    這篇文章主要為大家詳細(xì)介紹了使用Kotlin開發(fā)Android應(yīng)用的教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android ListView詳解

    Android ListView詳解

    listview控件在項(xiàng)目開發(fā)過程中經(jīng)常會(huì)用到,本文給大家分享android listview相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • 詳解Flutter如何讀寫文本文件

    詳解Flutter如何讀寫文本文件

    文本文件(具有 .txt擴(kuò)展名)廣泛用于持久存儲(chǔ)信息,從數(shù)字?jǐn)?shù)據(jù)到長文本。本文主要為大家介紹了2個(gè)使用此文件類型的Flutter應(yīng)用程序示例,感興趣的可以了解一下
    2022-04-04

最新評(píng)論