在android中出现内存错误

时间:2011-10-15 10:28:34

标签: 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 个答案:

答案 0 :(得分:6)

我自己解决了问题。

这是我在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);
   }

答案 1 :(得分:4)

不幸的是,这并没有为我解决问题。但是,这篇文章:

Unable to write into DataOutputStream beyond a specific size - OutOfMemoryError

节省了一天。

HttpConnection上,您应该使用HttpURLConnection.setFixedLengthStreamingModeHttpURLConnection.setChunkedStreamMode。否则,实际上什么都不会传输到服务器,你将达到内存限制。

您可以使用WireShark实际检查客户端和服务器之间的流量以确认这一点。

答案 2 :(得分:2)

只需在清单文件中添加android:largeHeap =“true”

参考:largeHeap=true manifest tag not working?