/* Copyright 2012-2013, Polyvi Inc. (http://polyvi.github.io/openxface) This program is distributed under the terms of the GNU General Public License. This file is part of xFace. xFace is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. xFace is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with xFace. If not, see <http://www.gnu.org/licenses/>. */ package com.polyvi.xface.http; import java.io.IOException; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.HttpResponseException; import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.util.EntityUtils; import com.polyvi.xface.util.XLog; import android.os.Handler; import android.os.Looper; import android.os.Message; /** * http响应体处理器 * */ public class XAsyncHttpResponseHandler { protected static final int SUCCESS_MESSAGE = 0; protected static final int FAILURE_MESSAGE = 1; private Handler mHandler; public XAsyncHttpResponseHandler() { if (Looper.myLooper() != null) { mHandler = new Handler() { @Override public void handleMessage(Message msg) { XAsyncHttpResponseHandler.this.handleMessage(msg); } }; } } /** * 消息处理 * * @param msg */ protected void handleMessage(Message msg) { Object[] response; switch (msg.what) { case SUCCESS_MESSAGE: response = (Object[]) msg.obj; onSuccess(((Integer) response[0]).intValue(), (Header[]) response[1], (String) response[2]); break; case FAILURE_MESSAGE: response = (Object[]) msg.obj; onFailure((Throwable) response[0], (String) response[1]); } } /** * 发送http response消息 * * @param response */ public void sendResponseMessage(HttpResponse response) { StatusLine status = response.getStatusLine(); String responseBody = null; HttpEntity entity = null; HttpEntity temp = response.getEntity(); if (temp != null) { try { entity = new BufferedHttpEntity(temp); responseBody = EntityUtils.toString(entity, "UTF-8"); } catch (IOException e) { sendFailureMessage(e, null); } } // 小于300的请求 都代表请求成功被服务器接收 理解 if (status.getStatusCode() >= 300) { sendFailureMessage(new HttpResponseException( status.getStatusCode(), status.getReasonPhrase()), responseBody); } else { sendSuccessMessage(status.getStatusCode(), response.getAllHeaders(), responseBody); } } /** * 成功回调 子类可以重载 * * @param statusCode * @param headers * @param content */ public void onSuccess(int statusCode, Header[] headers, String content) { } /** * 失败回调 子类可以重载 * * @param error * @param content */ public void onFailure(Throwable error, String content) { } /** * 发送成功消息 * * @param statusCode * http状态码 * @param headers * http响应头部 * @param body * http响应体 */ protected void sendSuccessMessage(int statusCode, Header[] headers, String body) { sendMessage(obtainMessage(SUCCESS_MESSAGE, new Object[] { new Integer(statusCode), headers, body })); } /** * 发送失败消息 * * @param e * 失败异常对象 * @param body * 失败的文本信息 */ protected void sendFailureMessage(Throwable e, String body) { sendMessage(obtainMessage(FAILURE_MESSAGE, new Object[] { e, body })); } /** * 工具函数 用于发送消息 * * @param msg */ protected void sendMessage(Message msg) { if (mHandler != null) { mHandler.sendMessage(msg); } else { handleMessage(msg); } } /** * 工具函数 用于获得消息对象 * * @param responseMessage * @param response * @return */ protected Message obtainMessage(int responseMessage, Object response) { Message msg = null; if (mHandler != null) { msg = this.mHandler.obtainMessage(responseMessage, response); } else { msg = Message.obtain(); msg.what = responseMessage; msg.obj = response; } return msg; } /** * 标示是否是异步响应 * * @return */ public boolean isAsync() { return true; } }