Problème Thread lancement de plusieurs Thread
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:
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:
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
Citation:
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.