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 :
Premier run (Download Video):
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 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; } }
Le Second (ReadVideo2) :
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 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(); }
ReadVideo Activité :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
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?
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 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)); } }
Merci à vous.
Partager