移动互联网开发技术教学网站项目研究第九篇

2021@SDUSC

加载网页方法

第一种:webView.LoadUrl(String url);

//通过访问网络地址获取
webView.loadUrl("https://www.csdn.net/");
//通过手机SD卡获取(Environment.getExternalStorageDirectory().getPath()是获取手机SD卡根目录的,后面就是目录的地址)
webView.loadUrl("file://"+ Environment.getExternalStorageDirectory().getPath()+"/1/index.heml");
//通过项目本地资源获取
webView.loadUrl("file:///android_asset/index.html");
//访问本地html
webView.loadUrl("http://192.168.252.164:8080");

第二种:loadUrl(String url,Map<String,String> additionalHttpHeaders);
url是所要访问的网络地址。
参数additionalHttpHeaders字面上的意思是:额外的http头部信息。这个方法是Android 2.2 (也就是API 8),WebView新增加了一个接口方法,就是为了便于用户加载网页同时又可以发送HTTP头信息的。

在Android系统中,有着多种存储数据的方式,例如,文件、数据库及程序内参数式存储、网络存储等。对于参数式存储时,使用的就是Map类。Map本身是接口,Java基于该接口实现三个具体的Map类,分别是HashMapTreeMapEnumMap,常用的为HashMap。Map类又是一个类模板,一个Map类对象在初始化时必须指定键的类型,可以是任何Object类,例如HashMap<String, String> header = new HashMap<>();,<>里面的数据类型用于指定Map集合中“键值对”的类型。 put(Objectkey,Objectvalue)方法可以添加一个新的键值对。

    HashMap<String, String> header = new HashMap<>();
    header.put("ECR-APP", "android");
    mWebView.loadUrl("http://m.test.366ec.net/Default2c.aspx",header);

第三种:loadData(String data,String mimeType,String encoding)
该方法有三个参数:HTML TAG ,MIME类型(text/html), 网页编码方式(utf-8)。

WebView wv = (WebView)findViewById(R.id.webview) ;  
String content = getUnicodeContent() ;    
wv.getSettings().setDefaultTextEncodingName(“UTF -8”) ;   
wv.loadData(content, “text/html”, “UTF-8”) ;  

使用该方法会出现的问题:
1、该方法不能加载图片内容,如果想要加载图片或者更强大的Web支持要使用下面第四种方法。
2、该方法使用时会显示乱码,是因为编译器设置错误。String类型的数据主要是unicode编码,而WebView一般为了节省资源使用的是UTF-8编码。为了正确显示需要将unicode编码的内容转成UTF-8编码的内容,并且为WebView的text编码指定编码方式。

第四种:loadDataWithBaseURL(String baseUrl,String data,String data,String
mimeType,String encoding,String historyUrl)
baseUrl为默认的html代码,data为要加载的html代码,mimeType为文本类型,encoding为编码格式,historyUrl为历史记录的html代码。

  String mimeType = "text/html";  
  String encoding = "utf-8";  
  String data = "<HTML>在模拟器上测试,这是<IMG src=\"APK'>file:///android_asset/igg.jpg\"/>APK里的图片";  
 webView.loadDataWithBaseURL(null, data, mimeType, encoding, null);  

webview.loadUrl("javascript:function() ")

webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view,String url){
                webView.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
            }
        });

使用该语句可以使Android去调用JS的代码,且JS代码调用一定要在 onPageFinished() 回调之后才能调用,否则不会调用。
JavaScript Window - 浏览器对象模型(BOM) 使 JavaScript 有能力与浏览器"对话",所有浏览器都支持 window 对象。它表示浏览器窗口。所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。document是它的一个对象包含整个 HTML 文档,可被用来访问文档内容及其所有页面元素。
getElementsByTagName() 方法可返回带有指定标签名的对象的集合,返回元素的顺序是它们在文档中的顺序,传递给该方法的字符串可以不区分大小写。getElementsByTagName(‘html’)[0]是在使用者非常了解文档结构的情况下,也可以使用 getElementsByTagName() 方法获取文档中的一个特定的元素。

fetchtwd——MainActivity内部类

private class fetchtwd extends AsyncTask<String, Integer, String> {
        protected String doInBackground(String... url) {
            try {
                URL u = new URL("https://www.shicimingju.com/chaxun/zuozhe/28.html");
                HttpURLConnection conn = (HttpURLConnection) u.openConnection();
                Log.i("tt", "ready to connect");
                conn.connect();
                Log.i("tt", "connection finished");

                if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    Log.i("tt", "connection successed");
                    InputStream in = conn.getInputStream();
                    InputStreamReader r = new InputStreamReader(in);
                    BufferedReader buffer = new BufferedReader(r);
                    tw_page = new StringBuffer();
                    String line = null;
                    while ((line = buffer.readLine()) != null) {
                        System.out.println("tw_page_length"+tw_page.toString().length());
                        tw_page.append(line);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return "return selected string"; // in tw_cont
        }

        protected void onProgressUpdate(Integer... progress) {
        }

AsyncTask类是一个Android 已封装好的轻量级异步类。属于抽象类,即使用时需实现子类。它可以实现多线程,在工作线程中执行任务,如耗时任务。还可以实现异步通信和消息传递,实现工作线程与主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作,保证线程安全。他可以很方便的实现异步通信,不需使用 “任务线程(如继承Thread类) + Handler”的复杂组合,而且节省资源,采用线程池的缓存线程 和 复用线程,避免了频繁创建和销毁线程所带来的系统资源开销。类中参数为3种泛型类型,第一个参数表示开始异步任务执行时传入的参数类型;第二个参数表示异步任务执行过程中,返回下载进度值的类型;第三个参数表示;第三个参数表示异步任务执行完成后,返回的结果类型。使用时并不是所有类型都被使用,若没有被使用,可以用java.lang.Void类型代替。上面两个方法,是它的核心方法。
doInBackground(String... url)方法的作用是接受输入参数、执行任务的耗时操作(必须复写,从而自定义线程任务)以及最后返回线程任务执行的结果。该方法在执行线程任务时即onPreExecute()执行完成后自动调用,由系统调用,不可以手动调用。上面项目就重写了该方法,自己定义了线程任务。
onProgressUpdate(Integer... progress)方法在主线程显示线程任务执行的进度,在调用publishProgress()时自动调用有,同样不能手动调用。
其他核心方法:
execute()方法作用是触发执行异步线程任务,需要自己是手动调用,而且必须在UI线程中调用,在主线程中运行。
onPreExecute()方法执行线程任务前的操作,在执行线程任务前即执行execute()前自动调用。一般用于界面的初始化操作,如显示进度条的对话框。
onPostExecute()方法用于接收线程任务执行结果,并且将执行结果显示到UI组件,必须复写,从而自己定义UI操作。在线程任务结束时系统自动调用。
onCancelled()方法将异步任务设置为取消状态,并不是真正的取消任务。在异步任务被取消时自动调用,需要在doInBackground(String… url)中判断终止任务。该方法被调用时,onPostExecute()就不会被调用。
这些方法执行顺序如下:

在这里插入图片描述
上面的UI线程是指:
当应用启动,系统会创建一个主线程。这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,应用和Android的UI组件发生交互,所以主线程也叫UI线程。系统不会为每个组件单独创建线程,在同一个进程里的UI组件都会在UI线程里实例化,系统对每一个组件的调用都是从UI线程分发出去的。结果就是,响应系统回调的方法永远都是在UI线程里进行的。当App在做一些比较繁重的操作的时候,比如网络请求、数据库操作等相关操作。如果这些工作都在UI线程里进行,就会阻塞UI线程,导致时间停止分发。对于用户来说,应用看起来就像卡住了,更坏的情况是,如果UI线程阻塞时间过长,用户就会看到应用无响应提示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值