2012-04-23 3 views
2

내 안드로이드 앱의 동영상을 서버에 업로드하려고합니다. 내 앱이 내 앱을 표시하려고 시도 할 때
04-23 13:07:41.602: ERROR/dalvikvm-heap(519): Out of memory on a 15607356-byte allocation. 왜 오류가 발생하는지 알지 못합니다. 내 질문은 비디오를 업로드 할 수 있습니까? 아래의 코드를 사용하여 50메가바이트 개까지 크기? 누군가가 알고 있다면
의미서버에 최대 50MB까지 동영상 업로드

private void doFileUpload(){ 
      HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      DataInputStream inStream = null; 
      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      String boundary = "*****"; 
      int bytesRead, bytesAvailable, bufferSize; 
      byte[] buffer; 
      int maxBufferSize = 8*1024*1024; 
      Cursor c = (MainscreenActivity.JEEMAHWDroidDB).query((MainscreenActivity.TABLE_Name), new String[] { 
        (MainscreenActivity.COL_HwdXml)}, null, null, null, null, 
           null); 
      if(c.getCount()!=0){ 
      c.moveToLast(); 
      for(int i=c.getCount()-1; i>=0; i--) { 
        value=c.getString(0);   
      } 
      } 
      String urlString = value+"/upload_file.php"; 
      try 
      { 
      //------------------ CLIENT REQUEST 
       UUID uniqueKey = UUID.randomUUID(); 
       fname = uniqueKey.toString(); 
       Log.e("UNIQUE NAME",fname); 

      FileInputStream fileInputStream = new FileInputStream(new File(selectedPath)); 
      URL url = new URL(urlString); 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 
      conn.setUseCaches(false); 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Connection", "Keep-Alive"); 
      conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 
      dos = new DataOutputStream(conn.getOutputStream()); 
      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + fname + "."+extension+"" + lineEnd); 
      dos.writeBytes(lineEnd); 
      bytesAvailable = fileInputStream.available(); 
      System.out.println("BYTES:--------->"+bytesAvailable); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      System.out.println("BUFFER SIZE:--------->"+bufferSize); 
      buffer = new byte[bufferSize]; 
      System.out.println("BUFFER:--------->"+buffer); 
      bytesRead = fileInputStream.read(buffer,0,bufferSize); 
      System.out.println("BYTES READ:--------->"+bytesRead); 
      while (bytesRead > 0) 
      { 
       dos.write(buffer, 0, bufferSize); 
       bytesAvailable = fileInputStream.available(); 
       bufferSize = Math.min(bytesAvailable, maxBufferSize); 
       bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
       System.out.println("RETURNED"); 
      } 
      dos.writeBytes(lineEnd); 
      dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

      Log.e("Debug","File is written"); 
      fileInputStream.close(); 
      dos.flush(); 
      dos.close(); 

      } 
      catch (MalformedURLException ex) 
      { 
       Log.e("Debug", "error: " + ex.getMessage(), ex); 
      } 
      catch (IOException ioe) 
      { 
       Log.e("Debug", "error: " + ioe.getMessage(), ioe); 
      } 
      //------------------ read the SERVER RESPONSE 
      try { 
        inStream = new DataInputStream (conn.getInputStream()); 
        String str; 

        while ((str = inStream.readLine()) != null) 
        { 
         Log.e("Debug","Server Response "+str); 
        } 
        inStream.close(); 

      } 
      catch (IOException ioex){ 
      Log.e("Debug", "error: " + ioex.getMessage(), ioex); 
      } 
+0

을 데이터를 게시하려면이 사용해야하는 경우 httppost 및 다중 엔티티이 코드는 "메모리 부족"같은 오류가 발생해야합니다 사용 후 uploading.its 강제로 내 활동을 마감했습니다 –

+0

내 앱이 최대 4.1MB까지 업로드됩니다. 그 이상으로 업로드하려고 시도하면 앱이 강제 종료됩니다. 여기에서 pblm이 발생합니까? 아무도 모른다면 this.Please 나를 조금 도와 줄래 –

답변

3

시도 교체

bytesAvailable = fileInputStream.available(); 
System.out.println("BYTES:--------->"+bytesAvailable); 
bufferSize = Math.min(bytesAvailable, maxBufferSize); 
System.out.println("BUFFER SIZE:--------->"+bufferSize); 
buffer = new byte[bufferSize]; 
System.out.println("BUFFER:--------->"+buffer); 
bytesRead = fileInputStream.read(buffer,0,bufferSize); 
System.out.println("BYTES READ:--------->"+bytesRead); 
while (bytesRead > 0) 
{ 
    dos.write(buffer, 0, bufferSize); 
    bytesAvailable = fileInputStream.available(); 
    bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    System.out.println("RETURNED"); 
} 

buffer = new byte[8192]; 
bytesRead = 0; 
while ((bytesRead = fileInputStream.read(buffer)) != -1) { 
    dos.write(buf, 0, bytesRead); 
} 

는 설명

과 : 버퍼 크기 감소하여 내 메모리 사용량을 줄이기 위해 시도 read()는 당신에게 그것을 읽을 바이트 수 또는 -1를 반환합니다 스트림의 마지막에 이르러 더 이상의 데이터를 읽을 수없는 경우. 또한 buffer의 처음 N 바이트를 읽은 데이터로 채 웁니다. (a = b) != c 구문은 먼저 b를 a에 할당 한 다음 값을 c와 비교합니다 (여기서 read을 실행하고 bytesRead에 결과를 할당하고 -1과 비교). 따라서 모든 바이트가 스트림의 처음부터 끝까지 읽힐 때까지 루프가 실행됩니다.

read 다음에 buffer의 데이터는 write을 통해 기록됩니다. bytesRead에서 알 수 있듯이 buffer의 바이트 수를 실제로 새로 읽은 바이트 수는 0에서 bytesRead까지의 바이트 만 쓸 것을 write에게 알려줍니다. InputStream.available() (스트림의 길이를 알 수없는 경우 의미없는 결과를 반환 할 수도 있음) 또는 다른 방법을 확인할 필요가 없습니다.

참고 :이 값을 while (bytesRead > 0)으로 변경하면 약간의 차이가 발생합니다. 0 바이트를 읽었지만 스트림의 끝까지 도달하지 않으면 읽기를 중지합니다. 이 사건은 일어날 수 없다고 생각하는 것이 안전하지만 합법적입니다. 그래도 bytesRead >= 0을 사용하면 더 안전합니다.

+0

코드를 설명해주세요. –

+0

감사합니다 !! 그러나 while 루프에서 약간의 변화가있었습니다. "while (bytesRead = fileInputStream.read (buffer))> 0) { dos.write (buf, 0, bytesRead); }" –

+0

은 루프가 꽤 많은 동안 표준 스트림 복사 패턴 및 모든 것을 인터넷에서 찾을 수 있습니다. – zapl

1

, 당신은 메모리가 부족 ... 저를 도와주세요.

int maxBufferSize = 2*1024*1024; 
+0

우리는 버퍼 크기를 줄이면 최대 50MB의 비디오를 업로드 할 수 있습니까? –

+0

iam에서 여전히 같은 오류가 발생합니다. 버그 수정을 도와 주시겠습니까? –

+0

@sundar buffersize는 8kb (8 * 1024)와 비슷해야합니다. 특히 느린 연결 인 경우에는 거대한 버퍼가 필요하지 않습니다. – zapl

0

심지어 내가 해당 MaxBufferSize 감소하지만 스피 여전히 같은 오류 동안 점점 ...