android - doinbackground 期间内存不足

标签 android android-asynctask out-of-memory

我有以下代码:-

public class ByState extends Fragment {
    @Nullable
    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.by_state, container, false);
        new GetAllStates().execute("dummy");
        return rootView;
    }
}
class GetAllStates extends AsyncTask<String,String,String> {
    @Override
    protected String doInBackground(String... key) {
        StringBuffer response = new StringBuffer();
        try {
            String url = "http://congress-search-148802.appspot.com/getData.php?value=legislator";
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");
            int responseCode = con.getResponseCode();
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }

            in.close();
        } catch (Exception e) {
            Log.w("Error", e.getMessage());
        }
        return response.toString();
    }
    @Override
    protected void onPostExecute(String groupResponse) {
        Log.d("My message",groupResponse);
        try {
            JSONArray groupList = new JSONArray(groupResponse);
            for(int i=0;i<groupList.length();i++){
                JSONObject groupInfo = groupList.getJSONObject(i);

                Log.d("BioguideID ",groupInfo.getString("bioguide_id"));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

我没有做太多,但仍然收到以下错误:-

1-15 00:05:02.793 27120-27157/com.app.congress.congressapp E/art: Throwing OutOfMemoryError "Failed to allocate a 203542 byte allocation with 150292 free bytes and 146KB until OOM"
11-15 00:05:02.803 27120-27157/com.app.congress.congressapp E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.app.congress.congressapp, PID: 27120
    java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
    Caused by: java.lang.OutOfMemoryError: Failed to allocate a 203542 byte allocation with 150292 free bytes and 146KB until OOM
        at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
        at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:125)
        at java.lang.StringBuilder.append(StringBuilder.java:271)
        at java.io.BufferedReader.readLine(BufferedReader.java:414)
        at com.app.congress.congressapp.GetAllStates.doInBackground(ByState.java:46)
        at com.app.congress.congressapp.GetAllStates.doInBackground(ByState.java:34)
        at android.os.AsyncTask$2.call(AsyncTask.java:292)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
        at java.lang.Thread.run(Thread.java:818) 

我已经尝试将堆增加到大堆,这是不推荐的,但我仍然收到此错误。我对此很陌生,有人能指出我哪里出错了吗??

最佳答案

很简单,您正试图缓冲太多数据。

这是你的罪魁祸首:

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}

由于您的数据源是 JSON,您可以简单地使用 JsonReader 逐条解析您的数据源。这样您就可以读取所有数据,而无需将它们全部同时存储在内存中。

有一个使用 JsonReader in the official documentation 的例子.

在你的情况下你会像这样初始化它:

JsonReader reader = new JsonReader(new InputStreamReader(con.getInputStream()));

关于android - doinbackground 期间内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40604952/

相关文章:

java - 使用 startActivityForResult() 调用时从相机返回

Android 注释未使用 buildToolsVersion 19.1.0 生成

java - Xamarin Binding Jar 给出错误 : does not implement inherited abstract member AsyncTask. DoInBackground(params Object[])

java - 如何更新 navMenuIcons 上的数字

android - 应用程序被杀死但 onTrimMemory 没有被调用

java - 没有 @Provides-annotated 方法就不能提供 Dagger 2

android - 如何指定 TransitionManager.beginDelayedTransition 仅影响直接 subview

java - 如何从服务器获得响应?

memory-management - 在 XNA 中,处理我不再需要的纹理的最佳方法是什么?

内存不足错误后PHP自动添加错误