Нехватка памяти ошибка в Android

Я работаю в Android. Я разрабатываю программу для загрузки файла на http-сервер.

но всякий раз, когда я запускаю эту программу и выбираю файл, размер которого немного больше, это приводит к следующей ошибке.

java.lang.OutOfMemoryError

     at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:93)


     at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218)

 ERROR/AndroidRuntime(557):     at 

org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl$DefaultHttpOut

putStream.write(HttpURLConnectionImpl.java:750)


10-15 03:08:32.113: ERROR/AndroidRuntime(557):     at 

java.io.DataOutputStream.write(DataOutputStream.java:101)

это мой файл для загрузки:-

HttpURLConnection conn = null;
        DataOutputStream dos = null;

        DataInputStream inStream = null;



        String existingFileName = "/mnt/sdcard/kuntal.PNG";


        Log.v("File upload",""+Environment.getExternalStorageDirectory().getAbsolutePath());
        String lineEnd = "\r\n";

        String twoHyphens = "--";

        String boundary =  "*****";

        int bytesRead, bytesAvailable, bufferSize;

        byte[] buffer;

        int maxBufferSize = 1*1024*1024;

        String responseFromServer = "";

        Log.v(TAG,"url=  ");

        String urlString = "http://192.168.1.126/MusicApplication/uploadmusic.php?title="+title_by_artist+"&category="+category_of_song+"&filename="+filename+"&price="+price_of_song+"&artist="+HomePageActivity.username;
        Log.v(TAG,"url=  "+urlString);
        try
        {
         //------------------ CLIENT REQUEST
        FileInputStream fileInputStream = new FileInputStream(new File(existingFileName) );

         // open a URL connection to the Servlet

         URL url = new URL(urlString);

         // Open a HTTP connection to the URL

         conn = (HttpURLConnection) url.openConnection();

         // Allow Inputs
         conn.setDoInput(true);

         // Allow Outputs
         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=\"" + existingFileName + "\"" + lineEnd);

         dos.writeBytes(lineEnd);

         // create a buffer of maximum size

         bytesAvailable = fileInputStream.available();

         bufferSize = Math.min(bytesAvailable, maxBufferSize);

         buffer = new byte[bufferSize];
         // read file and write it into form...
         bytesRead = fileInputStream.read(buffer, 0, bufferSize);
         while (bytesRead > 0)
         {
          dos.write(buffer, 0, bufferSize);

          bytesAvailable = fileInputStream.available();

          bufferSize = Math.min(bytesAvailable, maxBufferSize);

          bytesRead = fileInputStream.read(buffer, 0, bufferSize);

         }
         // send multipart form data necesssary after file data...
         dos.writeBytes(lineEnd);
         dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
         // close streams
         Log.e("Debug","File is written");
         fileInputStream.close();
         dos.flush();
         dos.close();
         Toast.makeText(this, "File Successfully Uploaded", Toast.LENGTH_SHORT).show();

        }
        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);
        }
        }




**and this is my php file for upload:-**


if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
{



    echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
    " has been uploaded";
    chmod ("Songs/".basename( $_FILES['uploadedfile']['name']), 0644);
} 
else
{

    echo "filename: " .  basename( $_FILES['uploadedfile']['name']);
    echo "target_path: " .$target_path;
}

Пожалуйста, помогите мне, что я должен сделать, чтобы загрузить файл немного большего размера, как в формате mp3. Заранее спасибо...

3 ответа

Решение

Я решил свою проблему сам.

Это те изменения, которые сделаны мной в моем java файл:-

     buffer = new byte[bufferSize];

     bufferSize = Math.min(bytesAvailable, maxBufferSize);


     byte byt[]=new byte[bufferSize];

     fileInputStream.read(byt);

     bytesRead = fileInputStream.read(buffer, 0, bufferSize);

     dos.write(buffer, 0, bufferSize);

В моей проблеме это следующее code заменяется: -

  while (bytesRead > 0)
 {


    dos.write(buffer, 0, bufferSize);

    bytesAvailable = fileInputStream.available();

    bufferSize = Math.min(bytesAvailable, maxBufferSize);

    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
   }

К сожалению, это не решило проблему для меня. Тем не менее, этот пост:

Невозможно записать в DataOutputStream сверх определенного размера - OutOfMemoryError

спас день

На ваше HttpConnection, вы должны использовать HttpURLConnection.setFixedLengthStreamingMode, или же HttpURLConnection.setChunkedStreamMode, В противном случае, на самом деле ничего не будет передано на сервер, и вы достигнете предела памяти.

Вы можете использовать WireShark для проверки трафика между вашим клиентом и сервером, чтобы подтвердить это.

Просто добавьте android:largeHeap="true" в ваш файл манифеста

Ref: largeHeap = true тег манифеста не работает?

Другие вопросы по тегам