我正在编写一个android应用程序。由于这个目标,我必须将10 mb大小的用户列表(插入)缓存到sqlite db。当用户触发api调用时,我将inputstream发送到BufferedReader并使用char[] buffer = new char[2048];
作为块,因为如果我逐行读取inputstream,脚本将无法继续执行(我认为这是因为我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)增加了80 mb,而不是10 mb,所以解决了吗?
此方法返回字符串结果后,我使用它来初始化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(),但它对内存使用没有影响。