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异步加载网页的更多相关文章

  1. Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页

    欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...

  2. Python+Selenium+PhantomJS下载JavaScript异步加载网页

    # -*- coding: utf-8 -*- from selenium import webdriver import selenium.webdriver.support.ui as ui fr ...

  3. 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。

    一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...

  4. 利用Crowbar抓取网页异步加载的内容 [Python俱乐部]

    利用Crowbar抓取网页异步加载的内容 [Python俱乐部] 利用Crowbar抓取网页异步加载的内容 在做 Web 信息提取.数据挖掘的过程中,一个关键步骤就是网页源代码的获取.但是出于各种原因 ...

  5. Scrapy爬取Ajax(异步加载)网页实例——简书付费连载

    这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ...

  6. 网页性能优化之异步加载js文件

    一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...

  7. Android开发--异步加载

    因为移动端软件开发思维模式或者说是开发的架构其实是不分平台和编程语言的,就拿安卓和IOS来说,他们都是移动前端app开发展示数据和用户交互数据的数据终端,移动架构的几个大模块:UI界面展示.本地数据可 ...

  8. iframe异步加载技术及性能

    我们会经常使用iframes来加载第三方的内容.广告或者插件.使用iframe是因为它可以和主页面并行加载,不会阻塞主页面.当然使用iframe也是有利有弊的:Steve Souders在他的blog ...

  9. Android异步加载

    一.为什么要使用异步加载? 1.Android是单线程模型 2.耗时操作阻碍UI线程 二.异步加载最常用的两种方式 1.多线程.线程池 2.AsyncTask 三.实现ListView图文混排 3-1 ...

随机推荐

  1. [Xcode]使用target进行协同开发

    协同开发时候发现难免会因为某些条件宏导致上传到SVN的代码影响到其他同时,但是每一次去修很多条件编译也不是很方便,所以可以通过新建自己的target来控制product. 一.创建自己的target: ...

  2. Object.Instantiate 实例

    static function Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Object ...

  3. TRIZ系列-创新原理-29-气动或液压结构原理

    气动或液压结构原理的详细表述例如以下:1)用气态或液态部件替代固体部件.能够用空气或者水,也能够用气垫或水垫,使这些部件膨胀.这条原理符合系统的动态性进化法则-柔性化.在改造系统时,我们能够尝试将系统 ...

  4. ffplay2 android 版正式公布

    项目地址:https://github.com/DeYangLiu/AndroidPlayer/ 下载链接: 看点: 支持软键盘输入和历史记录.使用了EditText和内部存储. 这里考虑了历史记录的 ...

  5. VSTO 学习笔记(十)Office 2010 Ribbon开发

    原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...

  6. LeetCode总结 -- 树的性质篇

    树的性质推断是树的数据结构比較主要的操作,一般考到都属于非常easy的题目,也就是第一道入门题.面试中最好不能有问题,力求一遍写对.不要给面试官不论什么挑刺机会.LeetCode中关于树的性质有下面题 ...

  7. Jetty:配置连接器

    连接器配置概览 连接器用于接收网络连接,配置一个连接器须要配置:  1)连接器的网络參数(比如:port):  2)连接器使用的服务(比如:executors,schedulers).  3)为接收连 ...

  8. tudou link

    http://www.tudou.com/programs/view/QdOktCIUfQ0/?tid=-1&aid=-120137222&pid=41050010&oid=2 ...

  9. 啊我V办我偶看篇未改片考i

    http://pan.baidu.com/share/link?shareid=3011665141&uk=338692646&third=15                http ...

  10. pthread_once()使用(某个时间在整个程序中仅执行一次,不确定是那个线程)

    在多线程环境中,有些事仅需要执行一次.通常当初始化应用程序时,可以比较容易地将其放在main函数中.但当你写一个库时,就不能在main里面初始化了,你可以用静态初始化,但使用一次初始化(pthread ...