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 : 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;
    }
}
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
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 : 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);
}
ReadVideo Activité :

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));
    }
}
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.