Problèmes avec les Runnable dans une activité
Bonsoir tout le monde,
J'ai un problème avec l'utilisation des Runnable dans mon activité. J'ai deux classes extends Runnable qui sont DownloadVideo et ReadVideo2. Je veux les appeler dans mon activité Client mais j'ai cette erreur : "Can't create handler inside thread that has not called Looper.prepare()"
J'ai cherché dans des forums mais je n'ai pas réussi à l'appliquer à ma situation.
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
| protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView1);
Connexion connexion = new Connexion();
connexion.execute();
}
// Connexion avec le serveur via Socket
private class Connexion extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
ConcurrentLinkedDeque<OutputStream[]> list = new ConcurrentLinkedDeque<>(); //Useless at the moment
DownloadVideo task = new DownloadVideo(list);
Thread thread = new Thread(task);
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
//
}
ReadVideo2 task2 = new ReadVideo2(list);
Thread thread2= new Thread(task2);
thread2.start();
return null;
}
} |
Premier run (Download Video):
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
| public void run() {
try {
client = new Socket(IP_SERVER, 9002); // Creating the server socket.
if (client != null) {
// Reception video
InputStream in = client.getInputStream();
OutputStream out[] = new OutputStream[1];
out[0] = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Movies/chrono2.mp4");
byte buf[] = new byte[1024];
int n;
while ((n = in.read(buf)) != -1) {
out[0].write(buf, 0, n);
//Ajout dans la liste en queue
list.addLast(out);
//System.out.println("byte : " + out);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
handler.post(this);
in.close();
out[0].close();
client.close();
} else {
System.out.println("Pas de serveur lancé sur le port " + client.getLocalPort() + " ...");
}
} catch (UnknownHostException e) {
System.out.println("Impossible de se connecter au serveur " + IP_SERVER);
e.printStackTrace();
} catch (IOException e) {
System.out.println("Impossible de se connecter au serveur" + IP_SERVER);
e.printStackTrace();
} |
Le Second (ReadVideo2) :
Code:
1 2 3 4 5 6 7
| View v;
Handler handler = new Handler();
public void run(){
ReadVideo rv = new ReadVideo();
rv.launchVideo(v);
handler.post(this);
} |
ReadVideo Activité :
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
| public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
launchVideo(v);
}
public void launchVideo(View v) {
try{
// Chemin de la vidéo
Uri videoUri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Movies/chrono2.mp4");
// Nouvelle activité qui permet de visionner une donnée (dans notre cas, la vidéo)
Intent intent = new Intent(Intent.ACTION_VIEW);
// On spécifie la donnée de l'activité ainsi que le MIME (ex: application, text, image, audio, etc.)
// On veut lancer l'APPLICATION MX Video Player donc le MIME est "application"
intent.setDataAndType(videoUri, "application/x-mpegURL");
intent.putExtra(EXTRA_VIDEO_LIST, new Parcelable[] {videoUri}); // Permet d'éviter de lire toutes les vidéos du dossier du chemin envoyé
//intent.setPackage(MXVP); // Limite les applications possibles à celle de MX Video Player
startActivity(intent);
}
catch( ActivityNotFoundException e2){
// displayToast(getResources().getString(R.string.error_unknownMX)); // Erreur, on affiche un message à l'utilisateur
// Log.e( "Error", getResources().getString(R.string.error_unknownMX));
}
} |
Autre question est-ce ce que je fais dans le ReadVideo2 l'appel de l'activité ReadVideo est bien exécuté pour pouvoir l'avoir dans un thread?
Merci à vous.