AsyncActivity异步加载网页
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.zip.GZIPInputStream; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionRequest;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils; import com.example.com.test.R; import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast; public class AsyncActivity extends Activity { private Button satrtButton;
private Button cancelButton;
private ProgressBar progressBar;
private TextView textView;
private DownLoaderAsyncTask downLoaderAsyncTask; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_test06_async);
initView();
} public void initView() {
satrtButton = (Button) findViewById(R.id.startButton);
cancelButton = (Button) findViewById(R.id.cancelButton);
satrtButton.setOnClickListener(new ButtonOnClickListener());
cancelButton.setOnClickListener(new ButtonOnClickListener());
progressBar = (ProgressBar) findViewById(R.id.progressBar);
textView = (TextView) findViewById(R.id.textView);
} private class ButtonOnClickListener implements View.OnClickListener {
public void onClick(View v) {
switch (v.getId()) {
case R.id.startButton:
// 注意:
// 1 每次需new一个实例,新建的任务只能执行一次,否则会出现异常
// 2 异步任务的实例必须在UI线程中创建
// 3 execute()方法必须在UI线程中调用。
downLoaderAsyncTask = new DownLoaderAsyncTask();
downLoaderAsyncTask.execute("http://cn.jarfire.org");
break;
case R.id.cancelButton:
// 取消一个正在执行的任务,onCancelled()方法将会被调用
downLoaderAsyncTask.cancel(true);
break;
default:
break;
}
} } // 构造函数AsyncTask<Params, Progress, Result>参数说明:
// Params 启动任务执行的输入参数
// Progress 后台任务执行的进度
// Result 后台计算结果的类型
private class DownLoaderAsyncTask extends AsyncTask<String, Integer, String> { // onPreExecute()方法用于在执行异步任务前,主线程做一些准备工作
@Override
protected void onPreExecute() {
super.onPreExecute();
textView.setText("调用onPreExecute()方法--->准备开始执行异步任务");
System.out.println("调用onPreExecute()方法--->准备开始执行异步任务");
} // doInBackground()方法用于在执行异步任务,不可以更改主线程中UI
@Override
protected String doInBackground(String... params) {
System.out.println("调用doInBackground()方法--->开始执行异步任务");
try {
return doHttpClient(params[0]);
} catch (Exception e) {
return null;
}
} // onPostExecute()方法用于异步任务执行完成后,在主线程中执行的操作
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Toast.makeText(getApplicationContext(),
"调用onPostExecute()方法--->异步任务执行完毕", 0).show();
// textView显示网络请求结果
textView.setText(result);
System.out.println("调用onPostExecute()方法--->异步任务执行完毕");
} // onProgressUpdate()方法用于更新异步执行中,在主线程中处理异步任务的执行信息
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// 更改进度条
progressBar.setProgress(values[0]);
// 更改TextView
textView.setText("已经加载" + values[0] + "%");
} // onCancelled()方法用于异步任务被取消时,在主线程中执行相关的操作
@Override
protected void onCancelled() {
super.onCancelled();
// 更改进度条进度为0
progressBar.setProgress(0);
// 更改TextView
textView.setText("调用onCancelled()方法--->异步任务被取消");
System.out.println("调用onCancelled()方法--->异步任务被取消");
} // 获取url的数据-------------------可以正常使用
private String doHttpClient(String urlString) throws ClientProtocolException, IOException, InterruptedException {
BasicHttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 6 * 1000);
HttpConnectionParams.setSoTimeout(httpParams, 6 * 1000);
HttpClient client = new DefaultHttpClient(httpParams);// 老方法
HttpGet get = new HttpGet(urlString);
HttpResponse response = client.execute(get);
System.out.println("-----------------------");
System.out.println(response.getStatusLine());
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = response.getEntity(); //-----------------------------测试
String webContent = "";
if (entity !=null) {
entity = new BufferedHttpEntity(entity);// 在一些情况下可能会不止一次的读取实体。此时实体内容必须以某种方式在内存或磁盘上被缓冲起来。最简单的方法是通过使用BufferedHttpEntity类来包装源实体完成。这会引起源实体内容被读取到内存的缓冲区中。在其它所有方式中,实体包装器将会得到源实体。
webContent = EntityUtils.toString(entity);
System.out.println("Response getContentLength: "+ entity.getContentLength());
System.out.println("Response toString() length: "+ webContent.length());
}
System.out.println(response.toString()); //显示HTTP请求header
System.out.println("----------------------------------------");
//-------------------------------- InputStream is = entity.getContent();
long total = 0;
total = entity.getContentLength();
Log.v("AC", "total="+total);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count = 0;
int length = -1;
while ((length = is.read(buffer)) != -1) {
bos.write(buffer, 0, length);
count += length;
// publishProgress()为AsyncTask类中的方法
// 常在doInBackground()中调用此方法
// 用于通知主线程,后台任务的执行情况.
// 此时会触发AsyncTask中的onProgressUpdate()方法
Log.v("AC", "count/total="+count+"/"+total);
publishProgress((int) ((count / (float) total + 0.005f) * 100));
// 为了演示进度,休眠1000毫秒
Thread.sleep(1000);
}
is.close();
return new String(bos.toByteArray(), "UTF-8");
}
get.abort();
client.getConnectionManager().shutdown();
return null;
} // 开启http下载
private InputStream openHttpConnection(String urlString) throws IOException {// 压缩了的文件
InputStream in = null;
int response = -1;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection)) {
throw new IOException("It is not an HTTP connection");
}
try {
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setConnectTimeout(5*1000);
httpConn.setReadTimeout(5*1000);
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
// 在诸多的网站中,特别是大型的网站,设置了必须是浏览器的请求才会回应。之所以这样设置,就是为了防止我们这种项目给他产生无意义的请求(往往这种请求都是大批量,对其服务器产生负荷)。那为了解决这个问题,我们需要在http请求中,添加属性。
httpConn.setRequestProperty("Charset", "UTF-8");
httpConn.setRequestProperty("Accept-Encoding", "identity");
httpConn.setRequestProperty("Accept-Encoding", "gzip");//为什么没有deflate呢?至于为什么要设置 gzip,而又不设置deflate,原因如下,有些网站他不管你能接受什么压缩格式,统统也会压缩网页内容传给你。当然IE,FF能处理好这些内容。所以我们通过浏览器查看的时候完全正常。一般gzip的压缩可以将一个33K的文件压缩成7K,这样会节约不少带宽,但服务器的负荷并没有减轻,因为他要压缩文件呀。至于为什么不用deflate,是由于绝大多数网站的压缩方式是用gzip,而在有些网站中,明明是用的gzip却返回deflate的压缩标识。这有什么意义呢,所以干脆就告诉服务器,我不接受deflate,因为他太丑了,又长,哪像gzip这么潮呀。呵呵,对于浏览量大的静态网页服务器,这样做很是必要。100M的独享服务器,他也只有100M呀。
httpConn.setRequestProperty("Connection", "Keep-Alive");//keep-Alive,有什么用呢,你不是在访问网站,你是在采集。嘿嘿。减轻别人的压力,也是减轻自己。
httpConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");//这样就设置好了,你可以随意设置你的操作系统值,浏览器值,版本,只要正确就OK了。这样就可以正常有效地访问其网站了。他可不知道你是不是浏览器。你即使是条狗,他也不知道。
httpConn.setUseCaches(false);//不要用cache,用了也没有什么用,因为我们不会经常对一个链接频繁访问。(针对程序)
httpConn.connect();
response = httpConn.getResponseCode();
Log.v("AC", "response:"+response);
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
long x = httpConn.getContentLength();
Log.v("AC", "总长度:"+x);
}
} catch (Exception ex) {
Log.v("Networking", ex.getLocalizedMessage());
throw new IOException("Error connecting");
}
return in; }
} /**
*
* @param urlConn
* @param charset
* @return
*/
public static String getContentFromIn(HttpURLConnection urlConn, String charset) { BufferedReader br = null;
StringBuilder content = new StringBuilder(200);
InputStream in = null;
try {
if (null == urlConn) {
return "";
}
if (isNotEmpty(urlConn.getContentEncoding())) {
String encode = urlConn.getContentEncoding().toLowerCase();
if (isNotEmpty(encode)
&& encode.indexOf("gzip") >= 0) {
in = new GZIPInputStream(urlConn.getInputStream());
}
} if (null == in) {
in = urlConn.getInputStream();
}
if (null != in) {
br = new BufferedReader(new InputStreamReader(in, charset));
String line = "";
while ((line = br.readLine()) != null) {
content.append(line);
}
} } catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
}
return content.toString();
} private static boolean isNotEmpty(String str) {
if(str.length() > 0) {
return true;
}
return false;
}
}
AsyncActivity异步加载网页的更多相关文章
- Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- Python+Selenium+PhantomJS下载JavaScript异步加载网页
# -*- coding: utf-8 -*- from selenium import webdriver import selenium.webdriver.support.ui as ui fr ...
- 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
- 利用Crowbar抓取网页异步加载的内容 [Python俱乐部]
利用Crowbar抓取网页异步加载的内容 [Python俱乐部] 利用Crowbar抓取网页异步加载的内容 在做 Web 信息提取.数据挖掘的过程中,一个关键步骤就是网页源代码的获取.但是出于各种原因 ...
- Scrapy爬取Ajax(异步加载)网页实例——简书付费连载
这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ...
- 网页性能优化之异步加载js文件
一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...
- Android开发--异步加载
因为移动端软件开发思维模式或者说是开发的架构其实是不分平台和编程语言的,就拿安卓和IOS来说,他们都是移动前端app开发展示数据和用户交互数据的数据终端,移动架构的几个大模块:UI界面展示.本地数据可 ...
- iframe异步加载技术及性能
我们会经常使用iframes来加载第三方的内容.广告或者插件.使用iframe是因为它可以和主页面并行加载,不会阻塞主页面.当然使用iframe也是有利有弊的:Steve Souders在他的blog ...
- Android异步加载
一.为什么要使用异步加载? 1.Android是单线程模型 2.耗时操作阻碍UI线程 二.异步加载最常用的两种方式 1.多线程.线程池 2.AsyncTask 三.实现ListView图文混排 3-1 ...
随机推荐
- python手记(47)
#!/usr/bin/env python # -*- coding: utf-8 -*- #http://blog.csdn.net/myhaspl #code:myhaspl@qq.com imp ...
- 《数字图像处理原理与实践(MATLAB版)》一书之代码Part2
本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part2(P43~80),代码运行结果请參见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MA ...
- OpenLayers学习笔记4——使用jQuery UI实现測量对话框
OpenLayers学习最好的方式就是跟着其自带的演示样例进行学习,另外对web前端的开发设计要了解,慢慢积累,这样在一般的小项目中应该是足够用了. 本篇參照量測demo实现对话框形式的量測,抛砖引玉 ...
- jsoup方法string转document
//Document doc2 = Jsoup.parseBodyFragment(element.text()); //String FieldName=doc ...
- 设计模式之迭代器模式(Iterator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Automatically generate serial number in abap
流水号的产生: 在ABAP开发中,很多地方都需要按照自己的规则生成流水号,把这些流水号保存进透明表,作为唯一标示. 一. 系统中设定流水号 使用T-Code SNRO来创建一个流水号标识对象. 输 ...
- 部署 Redis 群集
Windows 部署 Redis 群集 1,下载Redis for windows 的最新版本,解压到 c:\Redis 目录下备用https://github.com/MSOpenTech/re ...
- Windows Phone开发(47):轻松调用Web Service
原文:Windows Phone开发(47):轻松调用Web Service 众所周知(除了没用过VS的),在VS里面调用Web Service是一件很愉快的事情,不解释,相信很多朋友在以前的项目中肯 ...
- Linux从零到高手的进阶心得(转)
从2006年毕业至今,从事IT行业已经接近8个年头. 一路走来有很多心路历程和技术心得都写在了51CTO的博客中,不少文字现在看来已显稚嫩,但是这正是我真实的成长之路.这八年,从最基础的网络管理员开 ...
- 编写高效的JavaScript
Web前端性能优化——编写高效的JavaScript 前言 随着计算机的发展,Web富应用时代的到来,Web 2.0早已不再是用div+css高质量还原设计的时代.自Gmail网页版邮件服务的问世 ...