2016-11-15 1 views
3

я следующий код: -Из памяти во время doinbackground

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)  

Я попытался увеличить куча в большую кучу, которая не рекомендуется, но все же я получаю эту ошибку. Я довольно новичок в этом, может кто-нибудь указать, куда я иду не так?

+0

Вы используете устройство или AVD? – zerocool

+1

Вам нужно работать над полным ответом? Вы не можете использовать файл – AxelH

+0

Я использую AVD в настоящее время. – Anirban

ответ

4

Это просто, вы пытаетесь буферизовать слишком много данных.

Это ваш виновник:

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

Поскольку ваш источник данных JSON, вы можете просто использовать JSONReader для анализа вашего источника данных по частям. Таким образом, вы можете читать все данные, не имея все, хранящиеся в памяти одновременно.

Приведен пример использования JSONReader in the official documentation.

В вашем случае вы бы инициализировать его следующим образом:

JSONReader reader = new JSONReader(new InputStreamReader(con.getInputStream())); 
0

Синтаксический Json также положить в doInbackgroud() mehod

1

Большая куча является плохим решением. Вместо этого используйте Gson Streaming или Jackson. Или вы также можете использовать ответ @knossos.

 Смежные вопросы

  • Нет связанных вопросов^_^