-1

I am doing an android application to upload audio files to my web folder. However, I'm getting a NetworkOnMainException.

Here's what I've tried so far:

   public void onClick(View v) {
    // TODO onClick
        openGalleryAudio();
}

   public void openGalleryAudio(){

        Intent intent = new Intent();
        intent.setType("audio/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,"Select Audio "), SELECT_AUDIO);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {

        if (requestCode == SELECT_AUDIO)
        {
            System.out.println("SELECT_AUDIO");
            Uri selectedImageUri = data.getData();
            selectedPath = getPath(selectedImageUri);
            System.out.println("SELECT_AUDIO Path : " + selectedPath);

                     doFileUpload();    
        }


    }
}

 public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
 }

 private void doFileUpload(){
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String lineEnd = "rn";
        String twoHyphens = "--";
        String boundary =  "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1*1024*1024;
        String responseFromServer = "";
        String urlString = "http://mlssabio.x10.mx/strings-of-beads/webservice/uploadsong.php";
        try
        {
         //------------------ CLIENT REQUEST
        FileInputStream fileInputStream = new FileInputStream(new File(selectedPath) );
         // 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);
         // Don't use a cached copy.
         conn.setUseCaches(false);
         // Use a post method.
         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='uploaded_file';filename='"
                 + selectedPath + "'" + lineEnd);

         //dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""+ selectedPath + "\"" + 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();
        }
        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);
        }
 }

It gives me NetworkOnMainException..

I tried changing to:

  new Thread(new Runnable() {
                public void run() {
                     runOnUiThread(new Runnable() {
                            public void run() {
                                Log.d("Test", "uploading started.....");
                            }
                        });                      

                     doFileUpload();

                }
              }).start();   

But now it gives me OutOfMemory error

Full logcat error here:

 12-29 04:58:00.284: E/AndroidRuntime(3959): FATAL EXCEPTION: Thread-108
 12-29 04:58:00.284: E/AndroidRuntime(3959): java.lang.OutOfMemoryError
 12-29 04:58:00.284: E/AndroidRuntime(3959):    at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
 12-29 04:58:00.284: E/AndroidRuntime(3959):    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
 12-29 04:58:00.284: E/AndroidRuntime(3959):    at libcore.net.http.RetryableOutputStream.write(RetryableOutputStream.java:61)
 12-29 04:58:00.284: E/AndroidRuntime(3959):    at java.io.DataOutputStream.write(DataOutputStream.java:98)
 12-29 04:58:00.284: E/AndroidRuntime(3959):    at com.thesis.string.of.beads.AddSong.doFileUpload(AddSong.java:188)
 12-29 04:58:00.284: E/AndroidRuntime(3959):    at com.thesis.string.of.beads.AddSong.access$0(AddSong.java:142)
 12-29 04:58:00.284: E/AndroidRuntime(3959):    at com.thesis.string.of.beads.AddSong$1.run(AddSong.java:124)
 12-29 04:58:00.284: E/AndroidRuntime(3959):    at java.lang.Thread.run(Thread.java:841)

Line 188:

              dos.write(buffer, 0, bufferSize);

I don't know what's wrong or missing in this code your help will truly be appreciated. Thanks.

Dunkey
  • 1,900
  • 11
  • 42
  • 72
  • What did you learn when you searched StackOverflow or Google for the hundreds of questions and answers related to `NetworkOnMainThreadException`? – Simon Dec 29 '13 at 10:32

1 Answers1

1

Its because you're doing network operation on Main UI thread

if you're using threads to do network operations then you can use this code snippet

if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = 
        new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

in your OnCreate()

But its wrong practice to use above said operation, instead you should use AsyncTask class provided by android to handle properly network operation without blocking UI thread.

you can learn more by visiting this LINK

or can use the below code

private class UploadFiles extends AsyncTask<String, Void, Void> {
     protected String doInBackground(String... urls) {
         //THIS METHOD WILL BE CALLED AFTER ONPREEXECUTE
         //YOUR NETWORK OPERATION HERE
         return null;
     }

     protected void onPreExecute() {
         super.onPreExecute();
         //THIS METHOD WILL BE CALLED FIRST
         //DO OPERATION LIKE SHOWING PROGRESS DIALOG PRIOR TO BEGIN NETWORK OPERATION
     }

     protected void onPostExecute(String result) {
         super.onPostExecute();
         //TNIS METHOD WILL BE CALLED AT LAST AFTER DOINBACKGROUND
         //DO OPERATION LIKE UPDATING UI HERE
     }
 }

and you can simple call this class by writing

 new UploadFiles ().execute(new String[]{//YOUR LINK});
Nitin Misra
  • 4,472
  • 3
  • 34
  • 52
  • thanks but can you give me some sample implementations of asynctask in the above code that I used? – Dunkey Dec 29 '13 at 12:42
  • thank you! It now works but I'm still getting the OutOfMemoryError – Dunkey Dec 29 '13 at 14:18
  • @Dunkey `OUTOFMEMORY` is different issue, you stated the problem of `networkOnUiThread` that's what i provided you solution with, you should accept the answer if its helpful to you – Nitin Misra Dec 29 '13 at 14:20
  • Okay I accepted your answer, can you please help me figure out what's wrong with my second problem? here's the link to my new post: http://stackoverflow.com/questions/20825718/android-outofmemoryerror-when-sending-audio-file-to-server – Dunkey Dec 29 '13 at 14:23