0

晕伙计们,我想从 sql php 下载一个长字符串,并在 getHttpRespose() 方法中存储为“结果”,

并使用此“结果”更改为数据行并添加到 android 数据库中,但是一些低型号的 android 手机会导致 [outofmemoryerror bytearrayoutputstream] 错误,那么我该如何修改我的代码来解决这个问题?

谢谢大家的帮助!

private static String getHttpResponse() {
    String result = "";
    HttpGet request = new HttpGet(API_URL);
    HttpClient client = new DefaultHttpClient();
    InputStream inputStream = null;

    try {
        HttpResponse response = client.execute(request);
        Log.i("HTTP STATUS", ":" + response.getStatusLine().getStatusCode());

        if (response.getStatusLine().getStatusCode() == 200) {

            Log.i("HTTP STATUS 200", "CONNECTION SUCCESS");
            result = EntityUtils.toString(response.getEntity());
            jsonString = result;

        }
    } catch (ClientProtocolException e) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
        e.printStackTrace();
    } catch (IOException e) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
        e.printStackTrace();
    } catch (Exception e) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
        e.printStackTrace();
    }
    return result;
}

public static void addRecord(){
    createTable();

    InsertHelper ih = new InsertHelper(db, TABLE_CONTACTS);
    db.setLockingEnabled(false);
    db.beginTransaction();
    try {
        JSONObject jobject = new JSONObject(jsonString);
        JSONArray jarray = jobject.getJSONArray("result");
        int tempCategory = 0;
        for (int i = 0; i < jarray.length(); i++) {
            JSONObject oneObject = jarray.getJSONObject(i);
            ih.prepareForInsert();
            // Add the data for each column
            ih.bind(1, checkNull(oneObject, "storeID"));
            ih.bind(2, checkNull(oneObject, "tradeID"));
            ih.bind(3, checkNull(oneObject, "hasBranch"));
            ih.bind(4, checkNull(oneObject, "districtID"));
            ih.bind(5, checkNull(oneObject, "categoryID"));
            ih.bind(6, checkNull(oneObject, "name_en"));
            ih.bind(7, checkNull(oneObject, "name_tc"));
            ih.bind(8, checkNull(oneObject, "name_sc"));
            ih.bind(9, checkNull(oneObject, "addr_en"));
            ih.bind(10, checkNull(oneObject, "addr_tc"));
            ih.bind(11, checkNull(oneObject, "addr_sc"));
            ih.bind(12, checkNull(oneObject, "short_addr"));
            ih.bind(13, checkNull(oneObject, "tel"));
            ih.bind(14, checkNull(oneObject, "lat"));
            ih.bind(15, checkNull(oneObject, "lng"));
            ih.bind(16, checkNull(oneObject, "logo_url"));
            ih.bind(17, checkNull(oneObject, "img_url"));
            ih.bind(18, checkNull(oneObject, "coupon_url"));
            ih.bind(19, checkNull(oneObject, "sort_type"));
            ih.bind(20, checkNull(oneObject, "sort_order"));
            ih.bind(21, checkNull(oneObject, "sort_type_tc"));
            ih.bind(22, checkNull(oneObject, "sort_order_tc"));
            ih.bind(23, checkNull(oneObject, "sort_type_sc"));
            ih.bind(24, checkNull(oneObject, "sort_order_sc"));

            ih.execute();
            isSuccess=true;
            isFirst=true;
        }

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
        e.printStackTrace();
        Log.i("errorJSON", "errorJSON");
    } finally {
        ih.close(); // See comment below from Stefan Anca
    }

    db.setTransactionSuccessful();
    db.endTransaction();

    done = true;

}

11-03 19:24:23.193: ERROR/AndroidRuntime(28258): FATAL EXCEPTION: main
11-03 19:24:23.193: ERROR/AndroidRuntime(28258): java.lang.OutOfMemoryError
11-03 19:24:23.193: ERROR/AndroidRuntime(28258): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:93)
11-03 19:24:23.193: ERROR/AndroidRuntime(28258): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218)
4

1 回答 1

0

您可以在 AndroidManifest.xml 中使用 android:largeHeap="true" 以从 Android 的虚拟机请求更多内存。

于 2013-09-23T07:53:51.480 回答