开发者

out of Memory error in android

I am working in android. I am designing a program to upload a file to the http server.

but whenever i run this program and select a file which is a litt开发者_运维知识库le bit more in size then this will generate following error.

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)

this is my file for upload:-

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

please help me what should i do to upload file of a little more big size like as mp3 file. Thank you in advance...


I resolved my problem myself.

This is the changes which are made by me in my java file:-

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

In my problem this following code is replaced:-

  while (bytesRead > 0)
 {


    dos.write(buffer, 0, bufferSize);

    bytesAvailable = fileInputStream.available();

    bufferSize = Math.min(bytesAvailable, maxBufferSize);

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


Unfortunately this did not solve the problem for me. However, this post:

Unable to write into DataOutputStream beyond a specific size - OutOfMemoryError

saved the day.

On your HttpConnection, you should use HttpURLConnection.setFixedLengthStreamingMode, or HttpURLConnection.setChunkedStreamMode. Otherwise, nothing will actually be transferred to the server and you will hit the memory limit.

You can use WireShark to actually inspect the traffic between your client and server to confirm this.


Just add android:largeHeap="true" in your manifest file

Ref: largeHeap=true manifest tag not working?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜