HttpHelper.java

package com.newcj.net;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.*;import org.apache.http.util.ByteArrayBuffer;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Handler;import android.util.Log;/** * 帮助你访问 http 资源的工具类 *  * @author <a href="mailto:newcj@qq.com">newcj</a> * @version 1.0 2010/5/9 */public final class HttpHelper {public final static String TAG = "HttpHelper";private final static String CONTENT_TYPE = "application/x-www-form-urlencoded";private final static String ACCEPT = "*/*";private final static String USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5";/** * 1024 byte */private final static int BUFFER_LENGTH = 1024;private String referer;private Cookies cookies;private int timeout = 300000;public HttpHelper() {cookies = new Cookies();}/** * 获取超时时间,毫秒单位,默认为300000毫秒即5分钟 *  * @return */public int getTimeout() {return timeout;}/** * 设置超时时间 ReadTimeOut 与 ConnectTimeout 均设置为该超时时间,毫秒单位 *  * @param timeout */public void setTimeout(int timeout) {this.timeout = timeout;}/** * 获取 Referer *  * @return */public String getReferer() {return referer;}/** * 设置 Referer *  * @return */public void setReferer(String referer) {this.referer = referer;}/** * 以GET方法新建一个线程获取网页,编码方式为 gb2312,超时或编码错误返回null *  * @param strUrl *            网页URL地址 * @param handler *            用于向发起本次调用的线程发送结果信息 * @param what *            handler中的what标记 */public void getHtmlByThread(String strUrl, Handler handler, int what) {getHtmlByThread(strUrl, null, false, "gb2312", handler, what);}/** * 以GET方法新建一个线程获取网页,超时或编码错误返回null *  * @param strUrl *            网页URL地址 * @param encoding *            编码方式 * @param handler *            用于向发起本次调用的线程发送结果信息 * @param what *            handler中的what标记 */public void getHtmlByThread(String strUrl, String encoding,Handler handler, int what) {getHtmlByThread(strUrl, null, false, encoding, handler, what);}/** * 根据GET或POST方法新建一个线程获取网页,超时返回null *  * @param strUrl *            网页URL地址 * @param strPost *            POST 的数据 * @param isPost *            是否 POST,true 则为POST ,false 则为 GET * @param encoding *            编码方式 * @param handler *            用于向发起本次调用的线程发送结果信息 * @param what *            handler中的what标记 */public void getHtmlByThread(String strUrl, String strPost, boolean isPost,String encoding, Handler handler, int what) {if (handler == null)throw new NullPointerException("handler is null.");Thread t = new Thread(new Runner(strUrl, strPost, isPost, encoding,handler, what, Runner.TYPE_HTML));t.setDaemon(true);t.start();}/** * 以GET方法获取网页,编码方式为 gb2312,超时或编码错误返回null *  * @param strUrl *            网页URL地址 * @return 返回网页的字符串 */public String getHtml(String strUrl) {return getHtml(strUrl, null, false, "gb2312");}/** * 以GET方法获取网页,超时或编码错误返回null *  * @param strUrl *            网页URL地址 * @param encoding *            编码方式 * @return 返回网页的字符串 */public String getHtml(String strUrl, String encoding) {return getHtml(strUrl, null, false, encoding);}/** * 根据GET或POST方法获取网页,超时返回null *  * @param strUrl *            网页URL地址 * @param strPost *            POST 的数据 * @param isPost *            是否 POST,true 则为POST ,false 则为 GET * @param encoding *            编码方式 * @return 返回网页的字符串 */public String getHtml(String strUrl, String strPost, boolean isPost,String encoding) {String ret = null;try {byte[] data = getHtmlBytes(strUrl, strPost, isPost, encoding);if (data != null)ret = new String(data, encoding);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch block}return ret;}/** * 根据GET或POST方法获取网络数据,超时返回null *  * @param strUrl *            网页URL地址 * @param strPost *            POST 的数据 * @param isPost *            是否POST,true则为POST,false则为 GET * @param encoding *            编码方式 * @return 返回bytes */public byte[] getHtmlBytes(String strUrl, String strPost, boolean isPost,String encoding) {byte[] ret = null;HttpURLConnection httpCon = null;InputStream is = null;try {URL url = new URL(strUrl);httpCon = (HttpURLConnection) url.openConnection();httpCon.setReadTimeout(timeout);httpCon.setConnectTimeout(timeout);httpCon.setUseCaches(false);httpCon.setInstanceFollowRedirects(true);httpCon.setRequestProperty("Referer", referer);httpCon.setRequestProperty("Content-Type", CONTENT_TYPE);httpCon.setRequestProperty("Accept", ACCEPT);httpCon.setRequestProperty("User-Agent", USER_AGENT);httpCon.setRequestProperty("Cookie", cookies.toString());if (isPost) {httpCon.setDoOutput(true);httpCon.setRequestMethod("POST");httpCon.connect();OutputStream os = null;try {os = httpCon.getOutputStream();os.write(URLEncoder.encode(strPost, encoding).getBytes());os.flush();} finally {if (os != null)os.close();}}// 获取数据is = httpCon.getInputStream();ByteArrayBuffer baBuffer = null;byte[] buffer = new byte[BUFFER_LENGTH];int rNum = 0;// 若读取的数据长度小于 BUFFER_LENGTH,说明读取的// 内容小于 BUFFER_LENGTH 已经一次性读取完毕// 这个时候并不用创建 ByteArrayBuffer//// 以上并不适用// if ((rNum = is.read(buffer)) < BUFFER_LENGTH) {// ret = buffer;// } else {baBuffer = new ByteArrayBuffer(BUFFER_LENGTH << 1);// baBuffer.append(buffer, 0, BUFFER_LENGTH);while ((rNum = is.read(buffer)) != -1) {baBuffer.append(buffer, 0, rNum);}ret = baBuffer.toByteArray();// }} catch (Exception e) {// TODO Auto-generated catch blockLog.e(TAG, e.getMessage() + ":" + e.getCause());} finally {if (is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch block}}// 更新 Cookieif (httpCon != null) {cookies.putCookies(httpCon.getHeaderField("Set-Cookie"));// 更新 refererreferer = strUrl;httpCon.disconnect();}}return ret;}/** * 新建一个线程获取一张网页图片 *  * @param strUrl * @param handler *            用于向发起本次调用的线程发送结果信息 * @param what *            handler中的what标记 */public void getBitmapByThread(String strUrl, Handler handler, int what) {if (handler == null)throw new NullPointerException("handler is null.");Thread t = new Thread(new Runner(strUrl, null, false, null, handler,what, Runner.TYPE_IMG));t.setDaemon(true);t.start();}/** * 获取一张网页图片 *  * @param strUrl *            网页图片的URL地址 * @return */public Bitmap getBitmap(String strUrl) {byte[] data = getHtmlBytes(strUrl, null, false, null);return BitmapFactory.decodeByteArray(data, 0, data.length);}private class Runner implements Runnable {public final static int TYPE_HTML = 1;public final static int TYPE_IMG = 2;private String strUrl;private String strPost;private boolean isPost;private String encoding;private Handler handler;private int what;private int type;public Runner(String strUrl, String strPost, boolean isPost,String encoding, Handler handler, int what, int type) {this.strUrl = strUrl;this.strPost = strPost;this.isPost = isPost;this.encoding = encoding;this.handler = handler;this.what = what;this.type = type;}@Overridepublic void run() {// TODO Auto-generated method stubObject obj = null;switch (type) {case TYPE_HTML:obj = getHtml(strUrl, strPost, isPost, encoding);break;case TYPE_IMG:obj = getBitmap(strUrl);break;}synchronized (handler) {handler.sendMessage(handler.obtainMessage(what, obj));}}}}

Cookies.java

package com.newcj.net;import java.util.HashMap;import java.util.Map.Entry;import java.util.Set;/** * 非同步保存Cookie的键值 *  * @author SomeWind *  */public class Cookies {private HashMap<String, String> hashMap;public Cookies() {hashMap = new HashMap<String, String>();}/** * 清除 Cookies 里面的所有 Cookie 记录 */public void clear() {hashMap.clear();}/** * 根据 key 获取对应的 Cookie 值 *  * @param key *            要获取的 Cookie 值的 key * @return 如果不存在 key 则返回 null */public String getCookie(String key) {return hashMap.get(key);}/** * 在 Cookies 里设置一个 Cookie *  * @param key *            要设置的 Cookie 的 key * @param value *            要设置的 Cookie 的 value */public void putCookie(String key, String value) {hashMap.put(key, value);}/** * 在 Cookies 里面设置传入的 cookies *  * @param cookies */public void putCookies(String cookies) {if (cookies == null)return;String[] strCookies = cookies.split(";");for (int i = 0; i < strCookies.length; i++) {for (int j = 0; j < strCookies[i].length(); j++) {if (strCookies[i].charAt(j) == '=') {this.putCookie(strCookies[i].substring(0, j),strCookies[i].substring(j + 1,strCookies[i].length()));}}}}/** * 获取 Cookies 的字符串 */@Overridepublic String toString() {// TODO Auto-generated method stubif (hashMap.isEmpty())return "";Set<Entry<String, String>> set = hashMap.entrySet();StringBuilder sb = new StringBuilder(set.size() * 50);for (Entry<String, String> entry : set) {sb.append(String.format("%s=%s;", entry.getKey(), entry.getValue()));}sb.delete(sb.length() - 1, sb.length());return sb.toString();}}

更多相关文章

  1. Android(安卓)屏幕截图 代码
  2. Android(安卓)开发常用代码片段
  3. Android中获取SQL Server中的数据
  4. Android(安卓)GPS获得经纬度并得到该坐标精确地址
  5. android如何获取后台正在运行的service
  6. android > 获取 通讯录 信息
  7. Android通过Uri获取文件的路径的方法
  8. 【Android】获取apk的版本及包名等信息
  9. Android(安卓)http HttpURLConnection

随机推荐

  1. Android 内存泄漏相关
  2. Android寮€鍙戔€斺€擝roadcast Receiv
  3. Android系统定制和源码开发以及源码编译
  4. Android的进程间通信机制之Binder初探
  5. Android学习的几点建议(转)
  6. Android开发平台振动器系统详解
  7. android 调用Camera,获取预览帧中的图像
  8. android首次进入App新手引导
  9. Android View的事件分发机制和滑动冲突解
  10. Android(安卓)Studio设置HTTP代理地址