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

2021@SDUSC

具体实现内容分析

	TextView textview1;
    WebView webView;
    StringBuffer tw_page;
    String tw_ps = "<html><head></head><body>get twitter page failed.<br>retry maybe ok.</body><html>";
	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();
                conn.connect();
                if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    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) {
                        tw_page.append(line);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return "return selected string"; // in tw_cont
        }
        protected void onProgressUpdate(Integer... progress) {
        }
    	protected void onPostExecute(String result) {
            String tagA="<div class=\"shici_content\">";
            String tagB="</";
            String tagB2="<a";
            String left = tw_page.toString();
            Log.i("tt",""+left.length());
            int tagai = -1;
            tagai = left.indexOf(tagA);
            System.out.println("i find tagert"+tagai);
            int len = left.length();
            if (len > 5000)
                tw_ps = "";
            while (tagai >= 0) {
                left = left.substring(tagai + tagA.length());
                int tagbi = left.indexOf(tagB);
                int tagb2=left.indexOf(tagB2);
                if(tagb2<tagbi){
                    tagbi=tagb2;
                }
                if (tagbi >= 0) {
                    String p1 = left.substring(0, tagbi);
                    Log.e("TAG",p1);
                    tw_ps += "<p>" + p1 + "<p>";
                }
                tagai = left.indexOf(tagA);
            }

            webView.loadData(tw_ps, "text/html", "utf-8");
        }
    }

onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。该方法是AsyncTask类实现异步机制的一个方法。
在Android中实现异步任务机制有两种方式,HandlerAsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。
相对Handler,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。上一篇博客简单介绍了AsyncTask类,下面是介绍使用时注意事项:
1、异步任务的实例必须在UI线程中创建;
2、doInBackground(String... url) onProgressUpdate(Integer... progress) onPreExecute() onPostExecute()这四个方法都会在各种条件下系统自己调用。不同的是execute()方法作用是触发执行异步线程任务,需要自己是手动调用,而且必须在UI线程中调用,在主线程中运行;
3、不能在doInBackground(Params… params)中更改UI组件的信息;
4、每一个任务实例只能执行一次,如果执行第二次会抛出异常。
第一个方法中创建了一个访问地址URL,然后使用HttpURLConnection类访问HTTP协议。HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。

HttpURLConnection conn = (HttpURLConnection) u.openConnection();

这一句得到网络访问对象java.net.HttpURLConnection。

 conn.connect();

这一步建立连接。
conn.getResponseCode()得到响应状态码的返回值responseCode,如果返回值正常即等于HttpURLConnection.HTTP_OK,则建立连接成功。其中数据在网络中是以流的形式得到服务端返回的数据。

InputStream in = conn.getInputStream();
InputStreamReader r = new InputStreamReader(in);
 BufferedReader buffer = new BufferedReader(r);

从流中获取响应信息。当然也可以直接写为BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

while ((line = buffer.readLine()) != null) {
     tw_page.append(line);
}

然后循环从流中读取数据,放入定义好的字符缓冲区tw_page中。最后读取完成后应该关闭流。
该项目没有重写**onProgressUpdate(Integer… progress)**方法,该方法在调用publishProgress()时自动调用有,同样不能手动调用。
int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
**onPostExecute(Result result)会在doInBackground(String… url)**执行后执行,它获取了到的数据流转换为字符串,然后从中找到String tagA="<div class=\"shici_content\">";第一次出现处的索引。如果它的长度超过5000,tw_ps值改变。如果 tagA存在,则可以通过z好到tagA、tagB、tagB2的索引,找到对应所需要的HTML TAG,然后loadData(String data,String mimeType,String encoding)加载出网页内容。
这两个部分主要是为了找到HTML TAG然后显示对应的网页内容。其中建立连接访问HTTP,但是读取完成后并未断开连接释放资源。

onClick_refresh(View view)

public void onClick_refresh(View view) {
            if (true) {
                String cont = "<html><head></head><body>fetching  ...</body><html>";
                webView.loadData(cont, "text/html", "utf-8");
            }
            new fetchtwd().execute("not-used-url");
}

这一部分就是为了调用是上面写好的两个方法,execute()方法作用是触发执行异步线程任务,需要自己是手动调用,而且必须在UI线程中调用,在主线程中运行。然后根据执行顺序execute()->doInBackground()->onPostExecute()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值