2012-01-06 11 views
2

約5日前にアプリケーションが正常に動作していました!今日、私はそれを実行しようとすると、その絶対にナット行く!OutOfMemoryError Android

それが最終的にOutOfMemoryErrorを

01-06 04:14:17.088: D/dalvikvm(454): GC_FOR_MALLOC freed 5702 objects/326856 bytes in 76ms 
01-06 04:14:17.228: D/dalvikvm(454): GC_FOR_MALLOC freed 680 objects/157944 bytes in 57ms 
01-06 04:14:17.228: I/dalvikvm-heap(454): Grow heap (frag case) to 2.860MB for 121834-byte allocation 
01-06 04:14:17.288: D/dalvikvm(454): GC_FOR_MALLOC freed 1 objects/81232 bytes in 60ms 
01-06 04:14:17.378: D/dalvikvm(454): GC_FOR_MALLOC freed 5 objects/192 bytes in 65ms 
01-06 04:14:17.388: I/dalvikvm-heap(454): Grow heap (frag case) to 2.957MB for 182746-byte allocation 
....and so on... 

をスローして、最終的には、このエラーが起動する前に、私はlogcatでこのメッセージが出ています:

01-06 04:24:49.218: E/AndroidRuntime(511): java.lang.OutOfMemoryError 
01-06 04:24:49.218: E/AndroidRuntime(511): at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97) 
01-06 04:24:49.218: E/AndroidRuntime(511): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:136) 
01-06 04:24:49.218: E/AndroidRuntime(511): at java.lang.StringBuilder.append(StringBuilder.java:272) 
01-06 04:24:49.218: E/AndroidRuntime(511): at java.io.BufferedReader.readLine(BufferedReader.java:452) 
01-06 04:24:49.218: E/AndroidRuntime(511): at appsbidder.clientstuff.Utils.openURL(Utils.java:285) 
01-06 04:24:49.218: E/AndroidRuntime(511): at appsbidder.clientstuff.Utils.getFeatured(Utils.java:224) 
01-06 04:24:49.218: E/AndroidRuntime(511): at appsbidder.FeaturedAppsActivity$GridViewAdapter.<init>(FeaturedAppsActivity.java:45) 
01-06 04:24:49.218: E/AndroidRuntime(511): at appsbidder.FeaturedAppsActivity.onCreate(FeaturedAppsActivity.java:28) 
01-06 04:24:49.218: E/AndroidRuntime(511): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-06 04:24:49.218: E/AndroidRuntime(511): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
01-06 04:24:49.218: E/AndroidRuntime(511): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
01-06 04:24:49.218: E/AndroidRuntime(511): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
01-06 04:24:49.218: E/AndroidRuntime(511): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
01-06 04:24:49.218: E/AndroidRuntime(511): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-06 04:24:49.218: E/AndroidRuntime(511): at android.os.Looper.loop(Looper.java:123) 
01-06 04:24:49.218: E/AndroidRuntime(511): at android.app.ActivityThread.main(ActivityThread.java:4627) 
01-06 04:24:49.218: E/AndroidRuntime(511): at java.lang.reflect.Method.invokeNative(Native Method) 
01-06 04:24:49.218: E/AndroidRuntime(511): at java.lang.reflect.Method.invoke(Method.java:521) 
01-06 04:24:49.218: E/AndroidRuntime(511): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-06 04:24:49.218: E/AndroidRuntime(511): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-06 04:24:49.218: E/AndroidRuntime(511): at dalvik.system.NativeStart.main(Native Method) 

私は、このブロックにそれを絞り込むTHINKコードが、私はなぜそれが動作しないのか分からない!以前はいつもうまくいっていました。私が考えることができる唯一の問題は、以前よりも多くのデータをフェッチする必要があるため、どこかでオーバーフローが発生していますが、どこで??

おそらくここ
public JSONArray openURL(String urlParams, String url) 
    { 


    HttpsURLConnection connection = null; 
    try { 
     System.setProperty("http.keepAlive", "false"); 
     //Create connection 
     connection = (HttpsURLConnection)new URL(url).openConnection(); 
     connection.setRequestMethod("POST"); 


     connection.setRequestProperty("Content-Type", 
     "application/x-www-form-urlencoded"); 

     connection.setRequestProperty("Content-Length", "" + 
      Integer.toString(urlParams.getBytes().length)); 
     connection.setRequestProperty("Content-Language", "en-US"); 


     connection.setUseCaches(false); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 

     //Send request 
     DataOutputStream wr = new DataOutputStream (
        connection.getOutputStream()); 
     wr.writeBytes (urlParams); 
     wr.flush(); 
     wr.close(); 

     //Get Response  
     InputStream is = connection.getInputStream(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     JSONArray ja = new JSONArray(); 
     while((line = rd.readLine()) != null) { 
      ja = new JSONArray(line); 
     } 
     rd.close(); 
     return ja; 

    } catch (Exception e) { 

     e.printStackTrace(); 
     return null; 

    } finally { 

     if(connection != null) { 
     connection.disconnect(); 
     } 

    } 

    } 

答えて

2

while((line = rd.readLine()) != null) { 

応答は1行に大きなJSONが含まれている場合、あなたはこのラインでのOutOfMemoryErrorを持つことができます。これは、どのような応答が手動で行われているかを確認することで確認できます。

+1

は、どのように私は、それを修正するのでしょうか? – volk

0

私はこのコード行が間違っていると思う:代わりに

JSONArray ja = new JSONArray(); 
     while((line = rd.readLine()) != null) { 
      ja = new JSONArray(line); // in every step of loop, you create an object, that is wrong for memory 
     } 

使用:

JSONArray ja = new JSONArray(); 
     while((line = rd.readLine()) != null) { 
      ja.add(line); 
     } 

は、この情報がお役に立てば幸いです。エラーは、ReadLineメソッドの呼び出しでtrownあるので

 while((line = rd.readLine()) != null) { 
      ja = new JSONArray(line); 
     } 

:私はあなたがこれを見なければならない見ることができますどのような

+0

私はそれを試しましたが、それと同じ問題です。あなたはそれがjsonがちょうど大きすぎることができると思いますか? – volk

+0

私は思っていませんが、小さな検索の後、これについてのスレッドを見つけました。これをチェックしてください:http://stackoverflow.com/questions/2886599/android-outofmemoryerror-loading-json-file – barisatbas

3

01-06 04:24:49.218: E/AndroidRuntime(511): at java.lang.StringBuilder.append(StringBuilder.java:272) 
01-06 04:24:49.218: E/A ndroidRuntime(511): at java.io.BufferedReader.readLine(BufferedReader.java:452) 

あなたはこの試してみてください:この上の多くの例がありますが

char[] buffer = new char[8064]; 
BufferedReader rd = new BufferedReader(new InputStreamReader(is), buffer.length); 

と利用読みの代わりのreadLine

rd.read(buffer, 0, buffer.length) 

を。

EDIT:私の古いプロジェクトから

:JSONは非常に大きい場合

readResponse(InputStream inputStream) { 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
byte[] buffer = new byte[8064]; 

while(true) { 
int rd = inputStream.read(buffer) 
if(rd == -1)break; 
stream.write(buffer, 0 , rd); 
} 

stream.flush(); 
buffer = stream.toByteArray(); 
String response = new String(buffer); 
inputStream.close(); 

return response; 
} 
+0

これはありませんreadメソッドの最初の引数にはバイト[]ではなくchar []が必要なので、必ず動作します。 – volk

+0

私の編集後のコードを見てください。 –

+0

ええ、私は実際にそれを見ました。申し訳ありませんが、実際の問題は、私の "行"変数が文字列であるため、この方法では使用できないということです。ここにreadLineだけが適用されます。imが何かを失っていない限り、 – volk