2016-11-15 25 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 StreamingJackson。或者你也可以使用@knossos的答案。