博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AsyncActivity异步加载网页
阅读量:5251 次
发布时间:2019-06-14

本文共 9479 字,大约阅读时间需要 31 分钟。

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 后台计算结果的类型 private class DownLoaderAsyncTask extends AsyncTask
{ // 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; }}

 

转载于:https://www.cnblogs.com/swalka/p/5020174.html

你可能感兴趣的文章
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
比较安全的获取站点更目录
查看>>
空间分析开源库GEOS
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
linux php编译安装
查看>>
redis哨兵集群、docker入门
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
条件断点 符号断点
查看>>
Python Web框架Django (五)
查看>>