2014-09-11 4 views
0

J'ai un problème, j'essaie de faire une connexion à mon serveur local de tcp, pour télécharger une image. Mais je ne fonctionne pas et j'ai fait la connexion dans une méthode asinktask. Est-ce que quelqu'un savait d'où je pouvais venir?NetworkOnMainThreadException Connexion TCP AsinkTask

public class ComplexFTPTransfer extends AsyncTask<File, Long[], Void> 
{ 



    String server = "192.168.1.145"; 
    int port = 21; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     try { 
      ftpClient = new FTPClient(); 
      ftpClient.connect(server, port); 
      ftpClient.login("marc", "1234"); 
      ftpClient.enterLocalPassiveMode(); 

      System.out.println("!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); 
     } catch (SocketException e) { 
      this.cancel(true); 
     } catch (IOException e) { 
      this.cancel(true); 
     } 

     CameraActivity.this.setProgressBarIndeterminateVisibility(true); 

    } 


    @Override 
    protected Void doInBackground(File... params) { 
     if(!this.isCancelled()) 
     { 
      try 
      { 

       InputStream item = null; 

       try { 
        item = new FileInputStream(params[0]); 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


       int streamSize = 0; 
       while(item.read() != -1) 
       { 
        streamSize++; 
       } 

       InputStream is = new BufferedInputStream(item, streamSize); 
       OutputStream os = ftpClient.storeFileStream("/test.jpg"); 

       Util.copyStream(is, os, streamSize, streamSize, new CopyStreamListener() { 

        @Override 
        public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { 
         publishProgress(new Long[] {totalBytesTransferred, streamSize}); 
        } 

        @Override 
        public void bytesTransferred(CopyStreamEvent event) { 

        } 
       }); 
       ftpClient.completePendingCommand(); 

       ftpClient.logout(); 
       ftpClient.disconnect(); 

      } 
      catch (IOException e) { 

      } 
      catch (Exception e) { 

      } 
     } 
     return null; 
    } 


    @Override 
    protected void onProgressUpdate(Long[]... values) { 
     super.onProgressUpdate(values); 
     Log.d("UPDATE", values[0] + " of " + values[1] + " copied."); 
     //TODO Put code here 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     CameraActivity.this.setProgressBarIndeterminateVisibility(false); 
    } 
} 

est ici méthode,

Et je l'appelions ici sur le résultat de l'activité

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode != RESULT_OK) return; 

    Bitmap bitmap; 

    String path= ""; 
    if (requestCode == PICK_FROM_FILE) { 

     mImageCaptureUri = data.getData(); 

     path = getRealPathFromURI(mImageCaptureUri); //from Gallery 

     Log.i("Here", "Here we are"); 
     if (path == null) 

      path = mImageCaptureUri.getPath(); //from File Manager 

     if (path != null) 
      Log.i("Here", path); 
     bitmap = BitmapFactory.decodeFile(path); 
    } else { 
     path = mImageCaptureUri.getPath(); 
     bitmap = BitmapFactory.decodeFile(path); 
    } 



    /* 
    Mat gray_img = new Mat(); 
    Mat rgb_img = new Mat(); 

    Utils.bitmapToMat(bitmap, rgb_img);         
    Imgproc.cvtColor(rgb_img, gray_img, Imgproc.COLOR_RGBA2GRAY); 
    FeatureDetector surfDetector = FeatureDetector.create(FeatureDetector.ORB); 
    DescriptorExtractor surfDescriptor = DescriptorExtractor.create(DescriptorExtractor.ORB); 


    Vector<Mat> surfDescriptors = new Vector<Mat>(); 
    MatOfKeyPoint vector = new MatOfKeyPoint(); 
    Mat descriptor = new Mat(); 
    surfDetector.detect(rgb_img, vector); 
    surfDescriptor.compute(rgb_img, vector, descriptor); 
    surfDescriptors.add(descriptor); 
    String [] stringSurf = surfDescriptors.toArray(new String[0]); 

    */ 

    File firstLocalFile = new File(mImageCaptureUri.getPath()); 








    ftpTransfert = new ComplexFTPTransfer(); 
    ftpTransfert.execute(firstLocalFile); 


    networktask = new NetworkTask(); 
    networktask.execute(); 


    mImageView.setImageBitmap(bitmap); 

} 

Et voici mes erreurs du journal:

09-11 15:41:49.640: W/dalvikvm(17995): threadid=1: thread exiting with uncaught exception 
    09-11 15:41:49.640: E/AndroidRuntime(17995): FATAL EXCEPTION: main 
    09-11 15:41:49.640: E/AndroidRuntime(17995): Process: com.test.camera_zero, PID: 17995 
    09-11 15:41:49.640: E/AndroidRuntime(17995): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.test.camera_zero/com.test.camera_zero.CameraActivity}: android.os.NetworkOnMainThreadException 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.app.ActivityThread.deliverResults(ActivityThread.java:3351) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3394) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.app.ActivityThread.access$1300(ActivityThread.java:135) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.os.Handler.dispatchMessage(Handler.java:102) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.os.Looper.loop(Looper.java:136) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.app.ActivityThread.main(ActivityThread.java:5001) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at java.lang.reflect.Method.invokeNative(Native Method) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at java.lang.reflect.Method.invoke(Method.java:515) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at dalvik.system.NativeStart.main(Native Method) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): Caused by: android.os.NetworkOnMainThreadException 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at libcore.io.IoBridge.connect(IoBridge.java:112) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at java.net.Socket.connect(Socket.java:843) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at org.apache.commons.net.SocketClient.connect(SocketClient.java:182) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at org.apache.commons.net.SocketClient.connect(SocketClient.java:203) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at com.test.camera_zero.CameraActivity$ComplexFTPTransfer.onPreExecute(CameraActivity.java:401) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.os.AsyncTask.execute(AsyncTask.java:535) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at com.test.camera_zero.CameraActivity.onActivityResult(CameraActivity.java:203) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.app.Activity.dispatchActivityResult(Activity.java:5423) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): at android.app.ActivityThread.deliverResults(ActivityThread.java:3347) 
    09-11 15:41:49.640: E/AndroidRuntime(17995): ... 11 more 

` 

Merci à tous. Désolé pour mon erreur en anglais

Répondre

0

Essayez le code ci-dessous, j'ai supprimé les appels réseau de onPreexecute et l'ai ajouté dans doInBackground. Vous ne pouvez pas appeler des méthodes de réseau dans l'interface utilisateur fil

public class ComplexFTPTransfer extends AsyncTask<File, Long[], Void> 

{

String server = "192.168.1.145"; 
int port = 21; 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

    CameraActivity.this.setProgressBarIndeterminateVisibility(true); 

} 


@Override 
protected Void doInBackground(File... params) { 
    try { 
     ftpClient = new FTPClient(); 
     ftpClient.connect(server, port); 
     ftpClient.login("marc", "1234"); 
     ftpClient.enterLocalPassiveMode(); 

     System.out.println("!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); 
    } catch (SocketException e) { 
     this.cancel(true); 
    } catch (IOException e) { 
     this.cancel(true); 
    } 


    if(!this.isCancelled()) 
    { 
     try 
     { 

      InputStream item = null; 

      try { 
       item = new FileInputStream(params[0]); 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


      int streamSize = 0; 
      while(item.read() != -1) 
      { 
       streamSize++; 
      } 

      InputStream is = new BufferedInputStream(item, streamSize); 
      OutputStream os = ftpClient.storeFileStream("/test.jpg"); 

      Util.copyStream(is, os, streamSize, streamSize, new CopyStreamListener() { 

       @Override 
       public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { 
        publishProgress(new Long[] {totalBytesTransferred, streamSize}); 
       } 

       @Override 
       public void bytesTransferred(CopyStreamEvent event) { 

       } 
      }); 
      ftpClient.completePendingCommand(); 

      ftpClient.logout(); 
      ftpClient.disconnect(); 

     } 
     catch (IOException e) { 

     } 
     catch (Exception e) { 

     } 
    } 
    return null; 
} 


@Override 
protected void onProgressUpdate(Long[]... values) { 
    super.onProgressUpdate(values); 
    Log.d("UPDATE", values[0] + " of " + values[1] + " copied."); 
    //TODO Put code here 
} 

@Override 
protected void onPostExecute(Void result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    CameraActivity.this.setProgressBarIndeterminateVisibility(false); 
} 

}

2

Vous devrez déplacer tout votre code réseau vers la tâche asynchrone doInBackground(). Pour le moment, vous avez le code de configuration réseau ftpClient dans onPreExecute() qui s'exécute sur le thread principal de l'interface utilisateur.

2
bien

, que ce soit

ftpClient.connect(server, port); 
    ftpClient.login("marc", "1234"); 

nécessite une interaction réseau et puisque vous exécutez ceux OnPreExecute, qui exécute à son tour sur l'interface utilisateur de cette discussion, la NetworkOnMainThreadExecption est levée. Vous devez déplacer tous les éléments liés au réseau dans doInBackground