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;
	}
}
时间: 2024-10-13 12:25:32

AsyncActivity异步加载网页的相关文章

如何异步加载网页

同步加载是怎么样的 1 NSURL *url = [NSURL URLWithString:@"http://m.baidu.com"]; 2 NSData *data = [NSData dataWithContentsOfURL:url]; 3 UIImage *image = [UIImage imageWithData:data]; 那么,如何异步加载网页呢? 创建一个url对象 NSURLRequest *request = [NSURLRequest requestWith

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

一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代码,相信很多人都见过. 1 <script src="1.js"></script> 2 <script src="2.js"></script> 3 <script src="3.js">

Android异步加载全解析之大图处理

Android异步加载全解析之大图处理 异步加载中非常重要的一部分就是对图像的处理,这也是我们前面用异步加载图像做演示例子的原因.一方面是因为图像处理不好的话会非常占内存,而且容易OOM,另一方面,图像也比文字要大,加载比较慢.所以,在讲解了如何进行多线程.AsyncTask进行多线程加载后,先暂停下后面的学习,来对图像的异步处理进行一些优化工作. 为什么要对图像处理 为什么要对图像进行处理,这是一个很直接的问题,一张图像,不管你拿手机.相机.单反还是什么玩意拍出来,它就有一定的大小,但是在不同

26、首先通过javascript包的异步加载来学习echarts包的结构

1.在这里先写一写前言,今天在公司搞定了一个对于滚动条进行定位的case,明天开始做TestManagement. 首先大家先来一起看一看流行的javascript文件的加载方式,这里采用别人博客上的内容,因为自己也不会 前端模块化 (1)函数封装的缺点 直接在<script></script>中写function的方式 1 function fn1(){ 2 statement 3 } 4 5 function fn2(){ 6 statement 7 } 这种做法的缺点很明显:

[原创]cocos2dx加载网络图片&amp;异步加载图片

[动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到一张图片渐进(由模糊变清晰)的显示,如果在游戏中,诸如像显示高清卡牌的时候,使用有这种方式去显示一张图片,这样的体验应该会稍微好些 [相关知识] png interlaced:png图片在导出的时候是可以选择 interlaced (Adam7)的,这样的存储的png在网页上显示会渐进显示, 这种i

Ajax 异步加载

AJAX (Asynchronous JavaScript and XML,异步的 JavaScript 和 XML).它不是新的编程语言,而是一种使用现有标准的新方法,是在不重新加载整个页面的情况下与服务器交换数据并更新部分网页的艺术. 那么,让我们一起走进AJax的世界吧. 基础语法 获取Ajax对象 设置回调函数 readystate status 开启交互 客户端更新页面 实例体验 使用Servlet方式 AjaxServletjava webxml ajaxhtml 实验结果 使用JS

Android异步加载

Android异步加载 一.为什么要使用异步加载? 1.Android是单线程模型 2.耗时操作阻碍UI线程 二.异步加载最常用的两种方式 1.多线程.线程池 2.AsyncTask 三.实现ListView图文混排 3-1 实现读取网页中的json数据到ListView中 (图片首先为默认图片) 3.1.1:主布局只有一个ListView和一个listView_item的布局 3.1.2:网页json数据的链接(http://www.imooc.com/api/teacher?type=4&n

HTML5 &lt;script&gt;元素async,defer异步加载

HTML5的async和deferred属性的出现对于页面的初次渲染来说是一个福音,解决了加载js文件时的阻塞问题,实现了script标签的async异步属性.过去我们使用各种JavaScript技巧来做这种事情,但现在新的属性让防止阻塞变得相对容易. async - HTML属性 如我前面提到的,添加async属性非常简单: <!-- 指定async,以及 onload 回调--> <script async src="siteScript.js" onload=&

现代浏览器JS异步加载方案

好,不说废话,要凌晨了我快点写完,关于JS加载阻塞之类的不做科普,本文也不讨论IE9以下的浏览器. headjs:"异步.并行加载并按你的顺序执行",这个是最符合广大码农需求的,只是它越来越臃肿,连CSS Respone什么的都加进去了,没必要那么复杂 Loadjs:今天刚刚出现在OSC首页本人疯狂测试后发现,如果需要并行加载就是乱序的(哪个JS先下载完就先执行谁),如果要顺序下载就不能并发,经测试是下载一个执行一个,每个JS文件之间有10ms的空隙(JS下载和加载时所有渲染操作都要暂