Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何减少内存分配?_Java_Android_Android Memory_Android Profiler - Fatal编程技术网

Java 如何减少内存分配?

Java 如何减少内存分配?,java,android,android-memory,android-profiler,Java,Android,Android Memory,Android Profiler,我正在写一个android应用程序。出于这个目的,我必须(插入)将10MB大小的用户列表缓存到sqlite db。当用户触发api调用时,我将inputstream发送到BufferedReader并使用char[]buffer=new char[2048]作为块,因为如果我逐行读取inputstream,脚本将无法继续(我认为这是因为我的10mb正文是一行,太大而无法读取)。当这种情况发生时,我的内存使用从10mb增加到90mb。代码如下 private String getResult()

我正在写一个android应用程序。出于这个目的,我必须(插入)将10MB大小的用户列表缓存到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_uu为什么当我从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);
    ...........
}

公共类UserListResponse扩展了BaseResponse{
公共静态最终字符串UserList\u FIELD\u NAME=“UserList”;
公共列表用户列表;
公共UserListResponse(字符串baseStringResult){
试一试{
this.baseJsonResult=新的JSONObject(baseStringResult);
}捕获(JSONException e){
e、 printStackTrace();
}捕获(例外e){
this.baseJsonResult=新的JSONObject();
}
}
@凌驾
受保护的空映射字段(){
if(baseJsonResult.has(UserList\u FIELD\u NAME)和&!baseJsonResult.isNull(UserList\u FIELD\u NAME)){
试一试{
JSONArray jaPerson=baseJsonResult.getJSONArray(用户列表\字段\名称);
UserList=newarraylist(jaPerson.length());
for(int i=0;i
2\如果原因是我主要使用字符串字段,如何释放这些字符串字段。我想即使我用某种方法清除它们,它们还是会继续存在


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

如果您读取10MB
stringBuilder
将占用20MB,然后
Result
再读取20MB。。。此外,在每次迭代中放置
s
也将累计花费20MB。。。对于10MB JSON,显然最好使用一些流JSONparser@Selvin这是绝对正确的。下面是以下示例解决方案:1。2.仍然在等待一个示例代码,该代码在使用respnose类end后响应faslty的10mb post正文并减少内存分配:(当您将流提供给gson时,其中任何一个都起作用。fromJson()显示,如果不进行分块,则无法找到任何建议
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();
            }
        }
    }
}