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 :
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 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(); } } }
Je réussis à récupérer la liste mais il y a un problème lorsque je clique sur un item.
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; } }
Voici ce que j'obtiens dans le logcat
Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?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)
Merci d'avance pour votre aide.
Partager