Bonjour,

Je suis sur un petit projet pour télécharger des fichiers de mon PC à mon téléphone via socket et j'obtiens des erreurs de type android.os.NetworkOnMainThreadException
Ce qui laisserait supposer que je fais un traitement réseau dans mon Thread principal, or ça n'est pas le cas...

Voici mon code :

Coté serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
 
 
public class Fichier_serveur {
 
    public static File f=new File("C:\\Users\\JM\\workspace\\Fichier_Serveur");
    public static void main(String[] zero) throws IOException {
 
        ServerSocket socketserver;
        Socket serverClient;
        ObjectOutputStream out;
        BufferedInputStream bis;
        BufferedReader in;
        String[] liste_fichier = f.list();
 
 
        socketserver = new ServerSocket(8500) ;
        try{
            //PHASE 1 one envoi la liste des fichier
 
            serverClient = socketserver.accept() ;
            System.out.println("Connection envoi liste");
            out = new ObjectOutputStream(serverClient.getOutputStream());
            out.writeObject(liste_fichier);
            out.flush();
            out.close();    
            serverClient.close();
 
            //PHASE 2 on recoit le nom fichier a envoyer au client
            serverClient = socketserver.accept() ;
            System.out.println("Connection reception nom du fichier");
            in = new BufferedReader(new InputStreamReader(serverClient.getInputStream()));
            String nom_fichier = in.readLine();
            serverClient.close();
 
 
            //PHASE 3 on envoi le dit fichier
            serverClient = socketserver.accept() ;
            System.out.println("Connection envoi du fichier");
            File fichier_transfert = new File("" + nom_fichier);
            byte buf[] = new byte[1024];
            bis = new BufferedInputStream(new FileInputStream(fichier_transfert));
            while(bis.read(buf) != -1){
                serverClient.getOutputStream().write(buf);
            }
            bis.close();
            serverClient.close();
 
        }
        catch (UnknownHostException e) {
 
            e.printStackTrace();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }
}
coté client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package com.example.fichier_client;
 
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
public class MainActivity extends Activity {
 
    private Handler handler = new Handler();
    private Thread thread ;
    private Thread thread1 ;
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TraitementDonnées();
        ReceptionDonnees();
    }
    private void TraitementDonnées() {
 
        thread = new Thread(null,doBackgroundThreadProcessing,"Background");
        thread.start();
        Log.v("Lancement ", "Thread 1");
    }
 
    private void ReceptionDonnees(){
        thread1= new Thread(null, BackgroungReceptionProcessing,"Backgroung");
        thread1.start();
        Log.v("Lancement","Thread 2");
    }
 
 
    // Reception de la liste des fichier du PC
    private Runnable doBackgroundThreadProcessing = new Runnable() {
 
            @Override
            public void run() {
                ObjectInputStream in ;
                Socket socket;
                final String reception[];
 
                try{
                    //on etablit la connection et on récupère le flux entrant de la socket
                socket = new Socket("192.168.11.13",8500);
                    Log.v("Connection","etablie !");
                    in = new ObjectInputStream(socket.getInputStream());
 
                    //on stocke recupère les données sur la socket
                    reception = (String[]) in.readObject();
                    Log.v("Connection","reception liste");
                    handler.post(new Runnable(){
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            ListView list = (ListView)findViewById(R.id.listView1);    
                            ArrayAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,reception);
                            list.setAdapter(adapter);
                            list.setBackgroundColor(R.color.red);
                        }
                    });
                    socket.close();
                } catch (IOException e) {
                    Log.e("PAO","IO Exception.", e);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }             }
 
        };        
 
        // Envoi du nom du fichier a télécharger puis download    
        private Runnable BackgroungReceptionProcessing = new Runnable(){
 
            @Override
            public void run() {
                // TODO Auto-generated method stub
 
                Log.v("On est dans","le Thread 2");
                handler.postAtFrontOfQueue(new Runnable(){
                    @Override
                    public void run() {
                        ListView list = (ListView)findViewById(R.id.listView1);
                        list.setOnItemClickListener( new OnItemClickListener(){
 
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int position, long arg3) {
                        // TODO Auto-generated method stu
                        Socket socket ;
                        PrintWriter out;
                        String selected = (String) arg0.getItemAtPosition(position);
                        FileOutputStream fos;
                        BufferedOutputStream bos;
 
                        try {
                            // On envoie le nom du fichier a télécharger
                            socket = new Socket("192.168.11.13",8500);
                            Log.v("Connection","Envoi nom fichier !");
                            out = new PrintWriter(socket.getOutputStream());
                            out.println(selected);
                            out.flush();
                            out.close();
                            socket.close();
 
                            // on reçois le fichier en question
                            socket = new Socket("192.168.11.13",8500);
                            Log.v("Connection","Telechargement fichier !");
                            File fichier_reception = new File("" + selected);
                            bos = new BufferedOutputStream(new FileOutputStream(fichier_reception));
                            byte buf[] = new byte[1024];
 
                            while(socket.getInputStream().read(buf) != -1){
                                bos.write(buf);
                            }
                            bos.close();
                            socket.close();
 
                        } catch (UnknownHostException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
 
                    }
 
                });
                    }
            });
 
 
        };
        };
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
Je réussis à récupérer la liste mais il y a un problème lorsque je clique sur un item.

Voici ce que j'obtiens dans le logcat
01-30 20:36:54.925: V/Connection(2669): etablie !
01-30 20:36:55.050: V/Connection(2669): reception liste

01-30 20:37:00.735: D/AndroidRuntime(2669): Shutting down VM
01-30 20:37:00.735: W/dalvikvm(2669): threadid=1: thread exiting with uncaught exception (group=0x40c581f8)
01-30 20:37:00.755: E/AndroidRuntime(2669): FATAL EXCEPTION: main
01-30 20:37:00.755: E/AndroidRuntime(2669): android.os.NetworkOnMainThreadException
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
01-30 20:37:00.755: E/AndroidRuntime(2669): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
01-30 20:37:00.755: E/AndroidRuntime(2669): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-30 20:37:00.755: E/AndroidRuntime(2669): at libcore.io.IoBridge.connect(IoBridge.java:112)
01-30 20:37:00.755: E/AndroidRuntime(2669): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-30 20:37:00.755: E/AndroidRuntime(2669): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
01-30 20:37:00.755: E/AndroidRuntime(2669): at java.net.Socket.startupSocket(Socket.java:566)
01-30 20:37:00.755: E/AndroidRuntime(2669): at java.net.Socket.tryAllAddresses(Socket.java:127)
01-30 20:37:00.755: E/AndroidRuntime(2669): at java.net.Socket.<init>(Socket.java:177)
01-30 20:37:00.755: E/AndroidRuntime(2669): at java.net.Socket.<init>(Socket.java:149)
01-30 20:37:00.755: E/AndroidRuntime(2669): at com.example.fichier_client.MainActivity$2$1$1.onItemClick(MainActivity.java:114)
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.widget.AdapterView.performItemClick(AdapterView.java:292)
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.widget.AbsListView.performItemClick(AbsListView.java:1181)
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2709)
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.widget.AbsListView$1.run(AbsListView.java:3464)
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.os.Handler.handleCallback(Handler.java:605)
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.os.Handler.dispatchMessage(Handler.java:92)
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.os.Looper.loop(Looper.java:137)
01-30 20:37:00.755: E/AndroidRuntime(2669): at android.app.ActivityThread.main(ActivityThread.java:4511)
01-30 20:37:00.755: E/AndroidRuntime(2669): at java.lang.reflect.Method.invokeNative(Native Method)
01-30 20:37:00.755: E/AndroidRuntime(2669): at java.lang.reflect.Method.invoke(Method.java:511)
01-30 20:37:00.755: E/AndroidRuntime(2669): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
01-30 20:37:00.755: E/AndroidRuntime(2669): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
01-30 20:37:00.755: E/AndroidRuntime(2669): at dalvik.system.NativeStart.main(Native Method)
Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?

Merci d'avance pour votre aide.