0

我正在编写一个安卓应用程序。由于目标,我必须(插入)将我的 10 mb 大小的用户列表缓存到 sqlite db。当用户触发 api 调用时,我将输入流发送到 BufferedReader 并char[] buffer = new char[2048];用作块,因为如果我逐行读取输入流,则脚本不会继续(我认为这导致我的 10mb 正文是单行并且它太大而无法读取)。当这种情况发生时,我的内存使用量从 10mb 稳定增加到 90mb。代码如下

private String getResult() {
    String Result = "";


    try {
   ....    
        StringBuilder stringBuilder = new StringBuilder();
        int HttpResult = connection.getResponseCode();
        if (HttpResult == HttpURLConnection.HTTP_OK) {

            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), CharsetNames.Utf8.value));
            String line = null;
            char[] buffer = new char[2048];
            int count;
            while ((count = reader.read(buffer)) != -1) {
                String s = new String(buffer, 0, count);
                stringBuilder.append(s);

            }
            reader.close();
            Result = stringBuilder.toString();
        } else {
            Result = null;
        }
    } catch (InterruptedIOException e) {

    } catch (IOException e) {
        e.printStackTrace();
        Tools.ShowStandartErrorToast();
    }
    return Result;
}

1_为什么当我从 apicall 红色 10 mb 正文时为什么我的应用程序内存使用量(java)增加了 80mb 而不是 10mb 和解决方案?

在此方法返回字符串结果后,我使用它来初始化 json 对象。然后我使用那个 json 来初始化我的对象实例。在此操作之后,内存使用量减少到 320 mb。

protected Result doInBackground(Parameter Parameter) {

    ...........
       ApiHelper = new ApiHelper(getSelectedService(), parameter.getAsJson());
       String resultString = ApiHelper.getResult();
       result = setResult(resultString);
    ...........
}

public class UserListResponse extends BaseResponse {

    public static final String UserList_FIELD_NAME = "UserList";
    public List<User> UserList;

    public UserListResponse(String baseStringResult) {
        try {
            this.baseJsonResult = new JSONObject(baseStringResult);

        } catch (JSONException e) {
            e.printStackTrace();
        } catch (Exception e) {
            this.baseJsonResult = new JSONObject();
        }
    }

    @Override
    protected void mapFields() {


        if (baseJsonResult.has(UserList_FIELD_NAME) && !baseJsonResult.isNull(UserList_FIELD_NAME)) {
            try {

                JSONArray jaPerson = baseJsonResult.getJSONArray(UserList_FIELD_NAME);
                UserList = new ArrayList<>(jaPerson.length());

                for (int i = 0; i < jaPerson.length(); i++) {
                    JSONObject joPersonInfo = jaPerson.getJSONObject(i);
                    User pi = new User();
                    pi.init(joPersonInfo);
                    UserList.add(pi);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

2_如果原因是我主要使用字符串字段,我该如何释放这些字符串字段。我认为即使我用某种方法清除它们,它们也会继续生活。

我尽可能使用 System.gc() ,但它对内存使用没有影响。

4

0 回答 0