2012-11-05 3 views
1

아래 코드에서 메모리가 부족하다는 예외가 발생합니다.안드로이드에 BASE64 이미지를 게시하는 동안 java.lang.OutOfMemoryError

try { 
    String strBase64 = BitMapToString(bitmap); 
    bitmap.recycle(); 
    JSONObject data = new JSONObject(); 
    data.put("image_data", strBase64.toString()); 
    data.put("uploadedBy", "1"); 
    Log.i("JSON DATA", data.toString()); 
    HttpClient httpClient = new DefaultHttpClient(); 
    String url = "http://**.**.***.***:91/bisqup/index.php?r=ws/AddAppImage"; 
    HttpPost httpPost = new HttpPost(url); 
    List<NameValuePair> parameters = new ArrayList<NameValuePair>(); 
    parameters.add(new BasicNameValuePair("data", data.toString())); 
    httpPost.setEntity(new UrlEncodedFormEntity(parameters)); 
    HttpResponse response = httpClient.execute(httpPost); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
    String json = reader.readLine(); 
    JSONTokener tokener = new JSONTokener(json); 
    JSONObject finalResult = new JSONObject(tokener); 
    Log.i("Response", "" + finalResult.toString()); 
} catch (Exception e) { 
    // TODO: handle exception 
    e.printStackTrace(); 
} 

public String BitMapToString(Bitmap bitmap) { 
    try { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
     byte[] b = baos.toByteArray(); 
     String temp = Base64.encodeToString(b, Base64.DEFAULT); 
     baos.close(); 
     baos = null; 
     Log.i("BASE64", temp); 
     return temp; 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return null; 
    } 
} 

불행히도 나는 이와 같은 확장을 얻고 있습니다.

11-05 20:28:05.414: E/AndroidRuntime(23446): FATAL EXCEPTION: main 
11-05 20:28:05.414: E/AndroidRuntime(23446): java.lang.OutOfMemoryError 
11-05 20:28:05.414: E/AndroidRuntime(23446): at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:140) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at java.lang.StringBuilder.append(StringBuilder.java:125) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at org.json.JSONStringer.string(JSONStringer.java:344) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at org.json.JSONStringer.value(JSONStringer.java:252) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at org.json.JSONObject.writeTo(JSONObject.java:667) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at org.json.JSONObject.toString(JSONObject.java:636) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at com.siliconithub.android.bisqup.BisqupImagePreview$2.onClick(BisqupImagePreview.java:134) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at android.view.View.performClick(View.java:2485) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at android.view.View$PerformClick.run(View.java:9080) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at android.os.Handler.handleCallback(Handler.java:587) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at android.os.Looper.loop(Looper.java:130) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at android.app.ActivityThread.main(ActivityThread.java:3687) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at java.lang.reflect.Method.invokeNative(Native Method) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at java.lang.reflect.Method.invoke(Method.java:507) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
11-05 20:28:05.414: E/AndroidRuntime(23446): at dalvik.system.NativeStart.main(Native Method) 

아무도 왜이 메모리 문제가이 코드와 함께 올라 왔는지 말할 수 있습니까?

모든 의견을 환영합니다.

+1

라인 134는 게시물 전후의 로그입니까? 어쨌든 스트림 기반 json writer와 스트림 기반 base64 인코더를 사용하십시오. – njzk2

답변

1

JSONObject 클래스없이 JSON 객체를 생성 해보십시오. 매우 간단하므로 문자열을 작성하십시오.

String data = "{ image_data: \"" + strBase64.toString() + "\", uploadedBy: \"1\" }"; 
+1

JSON에서 오브젝트가 적을 때이를 수행하는 가장 쉬운 방법입니다. 고마워. –

1

String으로 읽을 때 대개의 경우 Bitmap이 너무 커서 그럴 경우 OutOfMemory 예외가 발생합니다. 이러한 종류의 요청에 을 입력하고 String 대신 FileBody을 사용해야합니다. 자세한 내용은 How to make a multi-part POST in Java을 참조하십시오.

+1

멀티 파트 POST를 사용할 수 있지만 웹 서비스 측면에서 멀티 파트 용으로 설계되지 않았으므로 멀티 파트 POST를 얻을 수 없습니다. 이것은 웹 서비스의 한계입니다. 그렇지만 multipart는이 문제의 해결책입니다. 괜찮습니다. 저는 여러분에게 완전히 동의합니다. –

관련 문제