Android http 请求——AsyncHttpClient集成【解决重定向问题、setEnableRedirects 方法异常、线程中调用异常问题】


  1. 引用android-async-http-1.4.6.jar;
  2. 添加HttpUtils.java类后即可直接使用;

  • 参考资料:
    官网——https://github.com/loopj/android-async-http
    AsyncHttpClient 中的重定向和 setEnableRedirects 方法异常解决——http://www.tuicool.com/articles/RN3ieei
    AsyncHttpClient保持session——http://blog.csdn.net/ewrfedf/article/details/21968511
  • 中文版使用文档
    http://www.cnblogs.com/angeldevil/p/3729808.html


    /**
     * @Title:  HttpUtils.java
     * @Description:  http请求工具类
     * @author:  lijinghuan
     * @data:  2015-3-18 下午1:17:48
     */
    package com.tnt.decoration.common.utils;


    import java.io.File;
    import java.io.UnsupportedEncodingException;


    import org.apache.http.Header;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.params.ClientPNames;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.client.DefaultRedirectHandler;
    import org.apache.http.protocol.HttpContext;


    import android.content.Context;
    import android.content.Intent;
    import android.os.Handler;
    import android.os.Message;


    import com.loopj.android.http.AsyncHttpClient;
    import com.loopj.android.http.AsyncHttpResponseHandler;
    import com.loopj.android.http.FileAsyncHttpResponseHandler;
    import com.loopj.android.http.PersistentCookieStore;
    import com.loopj.android.http.RequestParams;
    import com.tnt.decoration.common.enums.ConstEnum;
    import com.tnt.decoration.common.logger.Logger;


    public class HttpUtils {


    private static AsyncHttpClientOverride httpclient = null;
    private Object obj = null;
    private String REQ_KEY = "e74c9816a5b84a8eab5987d426f44b89";
    private final int POST_REQUEST_OBJECT = 1340885334;
    private final int POST_XML_REQUEST_OBJECT = 23261600;
    private final int GET_REQUEST_OBJECT = 1410754409;
    private final int DOWNLOAD_FILE_OBJECT = 740213559;


    protected void onCompleted(String target, String respones) {


    }


    protected void onCompleted(String target, String tagcontent, File cachefile) {


    }


    protected void onError(int statusCode, Header[] headers, String respones,
    Throwable error) {


    }


    protected void onError(int statusCode, Header[] headers, String respones,
    Throwable error, String reqkey) {


    }


    protected void onPgress(int bytesWritten, int totalSize) {


    }


    protected void onReqFinish() {


    }


    public Object getObj() {
    return obj;
    }


    public void setObj(Object obj) {
    this.obj = obj;
    }


    private void instance(Context context, boolean flag) {
    if (httpclient == null || flag) {
    httpclient = new AsyncHttpClientOverride(true, 80, 443);
    httpclient.setTimeout(30000);
    httpclient.setEnableRedirects(true, true, true);
    httpclient.getHttpClient().getParams()
    .setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true);
    httpclient
    .getHttpClient()
    .getParams()
    .setParameter(ClientPNames.MAX_REDIRECTS, Integer.MAX_VALUE);
    PersistentCookieStore mpcs = new PersistentCookieStore(context);
    httpclient.setCookieStore(mpcs);
    }
    }


    private void postRequestObject(Object paramesobj) {
    try {
    final RequestParamesEntity rpe = (RequestParamesEntity) paramesobj;
    instance(rpe.getContext(), false);
    httpclient.getHttpClient().getParams()
    .setParameter(REQ_KEY, rpe.getReqKey());
    httpclient.post(rpe.getUrl(), rpe.getParams(),
    new AsyncHttpResponseHandler() {
    @Override
    public void onFailure(int statusCode, Header[] headers,
    byte[] responseBody, Throwable error) {
    if (statusCode == 0) {
    Logger.L.error(statusCode, error,
    JsonUtils.toStr(headers),
    JsonUtils.toStr(responseBody));
    } else if (statusCode == 401) {
    sendUnLoginBroadcast(rpe.getContext());
    }
    Object reqkeyobj = httpclient.getHttpClient()
    .getParams().getParameter(REQ_KEY);
    String respones = responseBody == null ? ""
    : new String(responseBody).toString();
    onError(statusCode, headers, respones, error);
    onError(statusCode,
    headers,
    respones,
    error,
    reqkeyobj == null ? "" : reqkeyobj
    .toString());
    }


    @Override
    public void onSuccess(int statusCode, Header[] headers,
    byte[] responseBody) {
    onCompleted(rpe.getTarget(),
    responseBody == null ? "" : new String(
    responseBody).toString());
    }


    @Override
    public void onFinish() {
    onReqFinish();
    }
    });
    } catch (Exception e) {
    Logger.L.error("post request object error:", e);
    }
    }


    public void didPostRequestObject(Context context, String target,
    String url, RequestParams params, String reqKey) {
    RequestParamesEntity rpe = new RequestParamesEntity();
    rpe.setContext(context);
    rpe.setTarget(target);
    rpe.setUrl(url);
    rpe.setParams(params);
    rpe.setReqKey(reqKey);
    mhandler.obtainMessage(POST_REQUEST_OBJECT, rpe).sendToTarget();
    }


    public void didPostRequestObject(Context context, String target,
    String url, RequestParams params) {
    didPostRequestObject(context, target, url, params, "");
    }


    public void didPostRequestObject(Context context, String target,
    String url, String reqKey) {
    didPostRequestObject(context, target, url, new RequestParams(), reqKey);
    }


    public void didPostRequestObject(Context context, String target, String url) {
    didPostRequestObject(context, target, url, new RequestParams(), "");
    }


    private void postXmlRequestObject(Object paramesobj) {
    try {
    final RequestParamesEntity rpe = (RequestParamesEntity) paramesobj;
    instance(rpe.getContext(), false);
    StringEntity entity = null;
    try {
    entity = new StringEntity(rpe.getPostContent(), "UTF-8");
    } catch (UnsupportedEncodingException e) {
    Logger.L.error("build StringEntity object error:", e);
    }
    if (entity == null) {
    return;
    }
    httpclient.post(rpe.getContext(), rpe.getUrl(), entity,
    "string/xml;UTF-8", new AsyncHttpResponseHandler() {
    @Override
    public void onFailure(int statusCode, Header[] headers,
    byte[] responseBody, Throwable error) {
    if (statusCode == 0) {
    Logger.L.error(statusCode, error,
    JsonUtils.toStr(headers),
    JsonUtils.toStr(responseBody));
    } else if (statusCode == 401) {
    sendUnLoginBroadcast(rpe.getContext());
    }
    onError(statusCode, headers,
    responseBody == null ? "" : new String(
    responseBody).toString(), error);
    }


    @Override
    public void onSuccess(int statusCode, Header[] headers,
    byte[] responseBody) {
    onCompleted(rpe.getTarget(),
    responseBody == null ? "" : new String(
    responseBody).toString());
    }


    @Override
    public void onFinish() {
    onReqFinish();
    }
    });
    } catch (Exception e) {
    Logger.L.error("post xml request object error:", e);
    }
    }


    public void didPostXmlRequestObject(Context context, String target,
    String url, String postContent) {
    RequestParamesEntity rpe = new RequestParamesEntity();
    rpe.setContext(context);
    rpe.setTarget(target);
    rpe.setUrl(url);
    rpe.setPostContent(postContent);
    mhandler.obtainMessage(POST_XML_REQUEST_OBJECT, rpe).sendToTarget();
    }


    private void getRequestObject(Object paramesobj) {
    try {
    final RequestParamesEntity rpe = (RequestParamesEntity) paramesobj;
    instance(rpe.getContext(), false);
    httpclient.getHttpClient().getParams()
    .setParameter(REQ_KEY, rpe.getReqKey());
    httpclient.get(rpe.getUrl(), new AsyncHttpResponseHandler() {
    @Override
    public void onFailure(int statusCode, Header[] headers,
    byte[] responseBody, Throwable error) {
    if (statusCode == 0) {
    Logger.L.error(statusCode, error,
    JsonUtils.toStr(headers),
    JsonUtils.toStr(responseBody));
    } else if (statusCode == 401) {
    sendUnLoginBroadcast(rpe.getContext());
    }
    Object reqkeyobj = httpclient.getHttpClient().getParams()
    .getParameter(REQ_KEY);
    String respones = responseBody == null ? "" : new String(
    responseBody).toString();
    onError(statusCode, headers, respones, error);
    onError(statusCode, headers, respones, error,
    reqkeyobj == null ? "" : reqkeyobj.toString());
    }


    @Override
    public void onSuccess(int statusCode, Header[] headers,
    byte[] responseBody) {
    onCompleted(rpe.getTarget(), responseBody == null ? ""
    : new String(responseBody).toString());
    }


    @Override
    public void onProgress(int bytesWritten, int totalSize) {
    onPgress(bytesWritten, totalSize);
    }


    @Override
    public void onFinish() {
    onReqFinish();
    }
    });
    } catch (Exception e) {
    Logger.L.error("get request object error:", e);
    }
    }


    public void didGetRequestObject(Context context, String target, String url,
    RequestParams params, String reqKey) {
    RequestParamesEntity rpe = new RequestParamesEntity();
    rpe.setContext(context);
    rpe.setTarget(target);
    rpe.setUrl(url);
    rpe.setParams(params);
    rpe.setReqKey(reqKey);
    mhandler.obtainMessage(GET_REQUEST_OBJECT, rpe).sendToTarget();
    }


    public void didGetRequestObject(Context context, String target, String url,
    RequestParams params) {
    didGetRequestObject(context, target, url, params, "");
    }


    public void didGetRequestObject(Context context, String target, String url,
    String reqKey) {
    didGetRequestObject(context, target, url, new RequestParams(), reqKey);
    }


    public void didGetRequestObject(Context context, String target, String url) {
    didGetRequestObject(context, target, url, new RequestParams(), "");
    }


    private void didDownloadFileObject(Object paramesobj) {
    final RequestParamesEntity rpe = (RequestParamesEntity) paramesobj;
    instance(rpe.getContext(), false);
    httpclient.getHttpClient().getParams()
    .setParameter(REQ_KEY, rpe.getReqKey());
    httpclient.get(rpe.getUrl(),
    new FileAsyncHttpResponseHandler(rpe.getContext()) {
    @Override
    public void onSuccess(int statusCode, Header[] headers,
    File file) {
    onCompleted(rpe.getTarget(), rpe.getTagContent(), file);
    deleteTargetFile();
    }


    @Override
    public void onFailure(int statusCode, Header[] headers,
    Throwable error, File file) {
    if (statusCode == 0) {
    Logger.L.error(statusCode, error,
    JsonUtils.toStr(headers));
    } else if (statusCode == 401) {
    sendUnLoginBroadcast(rpe.getContext());
    }
    Object reqkeyobj = httpclient.getHttpClient()
    .getParams().getParameter(REQ_KEY);
    onError(statusCode, headers, "", error);
    onError(statusCode, headers, "", error,
    reqkeyobj == null ? "" : reqkeyobj.toString());
    }


    @Override
    public void onProgress(int bytesWritten, int totalSize) {
    onPgress(bytesWritten, totalSize);
    }


    @Override
    public void onFinish() {
    onReqFinish();
    }
    });
    }


    public void didDownloadFileObject(Context context, String target,
    String url, String reqKey, String tagcontent) {
    RequestParamesEntity rpe = new RequestParamesEntity();
    rpe.setContext(context);
    rpe.setTarget(target);
    rpe.setUrl(url);
    rpe.setReqKey(reqKey);
    rpe.setTagContent(tagcontent);
    mhandler.obtainMessage(DOWNLOAD_FILE_OBJECT, rpe).sendToTarget();
    }


    public void didDownloadFileObject(Context context, String target, String url) {
    didDownloadFileObject(context, target, url, "", "");
    }


    private class RequestParamesEntity {
    private Context context = null;
    private String target = "";
    private String url = "";
    private RequestParams params = null;
    private String reqKey = "";
    private String postContent = "";
    private String tagContent = "";


    /**
    * @return 获取context
    */
    public Context getContext() {
    return context;
    }


    /**
    * @param 设置context
    */
    public void setContext(Context context) {
    this.context = context;
    }


    /**
    * @return 获取target
    */
    public String getTarget() {
    return target;
    }


    /**
    * @param 设置target
    */
    public void setTarget(String target) {
    this.target = target;
    }


    /**
    * @return 获取url
    */
    public String getUrl() {
    return url;
    }


    /**
    * @param 设置url
    */
    public void setUrl(String url) {
    this.url = url;
    }


    /**
    * @return 获取params
    */
    public RequestParams getParams() {
    return params;
    }


    /**
    * @param 设置params
    */
    public void setParams(RequestParams params) {
    this.params = params;
    }


    /**
    * @return 获取reqKey
    */
    public String getReqKey() {
    return reqKey;
    }


    /**
    * @param 设置reqKey
    */
    public void setReqKey(String reqKey) {
    this.reqKey = reqKey;
    }


    /**
    * @return 获取postContent
    */
    public String getPostContent() {
    return postContent;
    }


    /**
    * @param 设置postContent
    */
    public void setPostContent(String postContent) {
    this.postContent = postContent;
    }


    /**
    * @return 获取tagContent
    */
    public String getTagContent() {
    return tagContent;
    }


    /**
    * @param 设置tagContent
    */
    public void setTagContent(String tagContent) {
    this.tagContent = tagContent;
    }
    }


    private class AsyncHttpClientOverride extends AsyncHttpClient {


    public AsyncHttpClientOverride(boolean fixNoHttpResponseException,
    int httpPort, int httpsPort) {
    super(fixNoHttpResponseException, httpPort, httpsPort);
    }


    @Override
    public void setEnableRedirects(final boolean enableRedirects) {
    ((DefaultHttpClient) getHttpClient())
    .setRedirectHandler(new DefaultRedirectHandler() {
    @Override
    public boolean isRedirectRequested(
    HttpResponse response, HttpContext context) {
    // int statusCode = response.getStatusLine()
    // .getStatusCode();
    // if (statusCode == 301 || statusCode == 302) {
    // return enableRedirects;
    // }
    return enableRedirects;
    }
    });
    }
    }


    private void sendUnLoginBroadcast(Context context) {
    Intent mintent = new Intent(ConstEnum.UnLoginBroadcastAction.getValue());
    context.sendBroadcast(mintent);
    }


    /**
    * 避免在线程中做http请求
    */
    private Handler mhandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case POST_REQUEST_OBJECT:
    postRequestObject(msg.obj);
    break;
    case POST_XML_REQUEST_OBJECT:
    postXmlRequestObject(msg.obj);
    break;
    case GET_REQUEST_OBJECT:
    getRequestObject(msg.obj);
    break;
    case DOWNLOAD_FILE_OBJECT:
    didDownloadFileObject(msg.obj);
    break;
    }
    }
    };
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当WebView第二次调用loadUrl时,页面不会刷新的原因可能是由于缓存导致的。因为WebView默认启用了缓存机制,当再次加载同一个URL时,会直接从缓存读取,而不会重新请求服务器。 要解决这个问题,可以通过以下两种方式: 1.禁用WebView缓存 在调用loadUrl之前,可以通过设置WebSettings对象禁用缓存: ```java webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); ``` 这样每次加载URL时,都会强制从服务器重新获取数据,并禁用缓存。 2.强制刷新WebView 在WebView添加一个刷新按钮,每次点击刷新按钮时,强制刷新WebView。具体实现如下: ```java // 添加一个刷新按钮 Button refreshBtn = findViewById(R.id.refresh_btn); refreshBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { webView.reload(); } }); // 在WebViewClient监听页面加载完成事件,并隐藏刷新按钮 webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); refreshBtn.setVisibility(View.GONE); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); refreshBtn.setVisibility(View.VISIBLE); } }); ``` 当页面加载完成时,隐藏刷新按钮;当页面加载失败时,显示刷新按钮。这样就可以通过点击刷新按钮来强制刷新WebView了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值