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 block            Log.e(TAG, e.getMessage() + ":" + e.getCause());        } finally {            if (is != null) {                try {                    is.close();                } catch (IOException e) {                    // TODO Auto-generated catch block                 }            }            // 更新 Cookie            if (httpCon != null) {                cookies.putCookies(httpCon.getHeaderField("Set-Cookie"));                // 更新 referer                referer = 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;        }         @Override        public void run() {            // TODO Auto-generated method stub            Object 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 的字符串     */    @Override    public String toString() {        // TODO Auto-generated method stub        if (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 Handler线程间通信机制分析
  2. Android 显示网页图片
  3. android 多线程下载原理
  4. 在android中举例说明如何用WebView.loadUri();来打开网页
  5. Android中的线程模型
  6. android 的线程模型和AsyncTask
  7. Android中的多线程之handler
  8. 《第一行代码--Android》读书笔记之多线程与服务
  9. Android异步机制一:使用Thread+Handler实现非UI线程更新UI界面

随机推荐

  1. Android(安卓)把个Excel 搞成sqlite数据
  2. Android以太网框架情景分析之启动简介
  3. android学习——windows 类详细介绍
  4. 重磅来袭!2020 年需要关注的 5 大 Android
  5. Android(安卓)自动点击
  6. 传智播客--ContentProvider共享数据和Con
  7. (转)Android中Dialog的“生命周期”
  8. Android(安卓)性能优化——使用优化集合
  9. Android(安卓)Studio——Android(安卓)Vi
  10. Android(安卓)使用外部db数据库文件