AndroidAsyncHttp 臨時修複 JsonHttpResponseHandler 避免死迴圈

來源:互聯網
上載者:User

由於 AndroidAsyncHttp 1.4.4 的 JsonHttpResponseHandler 存在死迴圈的 BUG,1.4.5 版本發布不知道要何時,所以只能臨時替換該類來修複這個錯誤。

Android開源庫loopj的android-async-http的 JsonHttpResponseHandler 存在死迴圈GC_CONCURRENT


package com.ai9475.extend;import com.ai9475.meitian.AppManager;import com.ai9475.meitian.R;import com.loopj.android.http.JsonHttpResponseHandler;import android.app.AlertDialog;import android.content.DialogInterface;import android.util.Log;import org.apache.http.Header;import org.apache.http.HttpStatus;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import org.json.JSONTokener;import java.io.UnsupportedEncodingException;/** * 複寫 AndroidAsyncHttp 1.4.4 開源庫的 JsonHttpResponseHandler 類 * 當 1.4.5 released 後失效 * * Created by ZHOUZ on 2014/3/22. */public class ZJsonHttpResponseHandler extends JsonHttpResponseHandler{    private static final String LOG_TAG = "JsonHttpResponseHandler";    /**     * Returns when request succeeds     *     * @param statusCode http response status line     * @param headers    response headers if any     * @param response   parsed response if any     */    public void onSuccess(int statusCode, Header[] headers, JSONObject response) {    }    /**     * Returns when request succeeds     *     * @param statusCode http response status line     * @param headers    response headers if any     * @param response   parsed response if any     */    public void onSuccess(int statusCode, Header[] headers, JSONArray response) {    }    /**     * Returns when request failed     *     * @param statusCode    http response status line     * @param headers       response headers if any     * @param throwable     throwable describing the way request failed     * @param errorResponse parsed response if any     */    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {    }    /**     * Returns when request failed     *     * @param statusCode    http response status line     * @param headers       response headers if any     * @param throwable     throwable describing the way request failed     * @param errorResponse parsed response if any     */    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {    }    @Override    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {        final AlertDialog.Builder dialog = new AlertDialog.Builder(AppManager.ActivityManager.current());        dialog.setIcon(android.R.drawable.ic_dialog_info);        dialog.setTitle(R.string.app_error);        dialog.setMessage(responseString);        dialog.setNegativeButton(R.string.sure,                new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        dialog.dismiss();                    }                });        dialog.show();    }    @Override    public void onSuccess(int statusCode, Header[] headers, String responseString) {    }    @Override    public final void onSuccess(final int statusCode, final Header[] headers, final byte[] responseBytes) {        if (statusCode != HttpStatus.SC_NO_CONTENT) {            new Thread(new Runnable() {                @Override                public void run() {                    try {                        final Object jsonResponse = parseResponse(responseBytes);                        postRunnable(new Runnable() {                            @Override                            public void run() {                                if (jsonResponse instanceof JSONObject) {                                    onSuccess(statusCode, headers, (JSONObject) jsonResponse);                                } else if (jsonResponse instanceof JSONArray) {                                    onSuccess(statusCode, headers, (JSONArray) jsonResponse);                                } else if (jsonResponse instanceof String) {                                    onFailure(statusCode, headers, (String) jsonResponse, new JSONException("Response cannot be parsed as JSON data"));                                } else {                                    onFailure(statusCode, headers, new JSONException("Unexpected response type " + jsonResponse.getClass().getName()), (JSONObject) null);                                }                            }                        });                    } catch (final JSONException ex) {                        postRunnable(new Runnable() {                            @Override                            public void run() {                                onFailure(statusCode, headers, ex, (JSONObject) null);                            }                        });                    }                }            }).start();        } else {            onSuccess(statusCode, headers, new JSONObject());        }    }    @Override    public final void onFailure(final int statusCode, final Header[] headers, final byte[] responseBytes, final Throwable throwable) {        if (responseBytes != null) {            new Thread(new Runnable() {                @Override                public void run() {                    try {                        final Object jsonResponse = parseResponse(responseBytes);                        postRunnable(new Runnable() {                            @Override                            public void run() {                                if (jsonResponse instanceof JSONObject) {                                    onFailure(statusCode, headers, throwable, (JSONObject) jsonResponse);                                } else if (jsonResponse instanceof JSONArray) {                                    onFailure(statusCode, headers, throwable, (JSONArray) jsonResponse);                                } else if (jsonResponse instanceof String) {                                    onFailure(statusCode, headers, (String) jsonResponse, throwable);                                } else {                                    onFailure(statusCode, headers, new JSONException("Unexpected response type " + jsonResponse.getClass().getName()), (JSONObject) null);                                }                            }                        });                    } catch (final JSONException ex) {                        postRunnable(new Runnable() {                            @Override                            public void run() {                                onFailure(statusCode, headers, ex, (JSONObject) null);                            }                        });                    }                }            }).start();        } else {            Log.v(LOG_TAG, "response body is null, calling onFailure(Throwable, JSONObject)");            onFailure(statusCode, headers, throwable, (JSONObject) null);        }    }    /**     * Returns Object of type {@link JSONObject}, {@link JSONArray}, String, Boolean, Integer, Long,     * Double or {@link JSONObject#NULL}, see {@link org.json.JSONTokener#nextValue()}     *     * @param responseBody response bytes to be assembled in String and parsed as JSON     * @return Object parsedResponse     * @throws org.json.JSONException exception if thrown while parsing JSON     */    protected Object parseResponse(byte[] responseBody) throws JSONException {        if (null == responseBody)            return null;        Object result = null;        //trim the string to prevent start with blank, and test if the string is valid JSON, because the parser don't do this :(. If Json is not valid this will return null        String jsonString = getResponseString(responseBody, getCharset());        if (jsonString != null) {            jsonString = jsonString.trim();            if (jsonString.startsWith("{") || jsonString.startsWith("[")) {                result = new JSONTokener(jsonString).nextValue();            }        }        if (result == null) {            result = jsonString;        }        return result;    }    /**     * Attempts to encode response bytes as string of set encoding     *     * @param charset     charset to create string with     * @param stringBytes response bytes     * @return String of set encoding or null     */    public static String getResponseString(byte[] stringBytes, String charset) {        try {            return stringBytes == null ? null : new String(stringBytes, charset);        } catch (UnsupportedEncodingException e) {            Log.e(LOG_TAG, "Encoding response into string failed", e);            return null;        }    }}

現在如果再出現 HTTP 500 或其他服務端錯誤(輸出非 JSON 字串)時將會直接彈出服務端頁面內容的對話方塊方便調試了,現在只能這樣了,等新版本發布後再轉換下吧!





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.