IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problèmes avec les Runnable dans une activité


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 96
    Par défaut 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 : 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.

  2. #2
    Membre très actif Avatar de alves1993
    Homme Profil pro
    Développeur Java/Dart/Javascript/Android (FullStack)
    Inscrit en
    Décembre 2012
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java/Dart/Javascript/Android (FullStack)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 222
    Par défaut
    Peux-tu afficher le code entier des classes DownloadVideo et ReadVideo ?
    Un geek ne vieillit pas, il se met à jour.

    Pour plus d'informations sur Android regarder la faq Android.
    Ensuite les tutoriels Android sont disponibles ici
    Pour les mecs, qui n'arrivent pas toujours à digérer le Javascript, Dart peut-être une solution pour vous.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Tu crée un handler de messages (donc nécessitant une boucle de gestion des dits messages, ce qu'on appelle le "Looper" dans android) dans un thread qui n'est pas supposé "handler" les messages.

    Je pense qu'il y a une conception bancale des threads, runnables, et autres...
    Par exemple: utiliser des threads (successifs) à l'intérieur d'un AsyncTask est complètement contre-productif. L'AsyncTask ayant déjà son thread à part, il peut très bien faire des temps d'attentes longs sans problème, ou attendre la lecture d'une donnée...

    Si le but est de lancer deux tâches parallèles (l'une lancée 1s après l'autre par exemple), alors inutile de passer par un AsyncTask.

    Utiliser un Handler dans l'activité, lancer la tâche #1, et demander de lancer la tache #2 dans 1s (par le handler).
    Le handler étant accessible aux tâches #1 et #2, il est alors possible de communiquer avec l'activité (qui ne gère que des évenements).

Discussions similaires

  1. Problème avec les update dans une BDD
    Par P.O.K dans le forum ASP.NET
    Réponses: 1
    Dernier message: 13/06/2011, 17h07
  2. [C#] Travailler efficacement avec les panels dans une forme
    Par WwiloO dans le forum Windows Forms
    Réponses: 8
    Dernier message: 27/06/2005, 15h33
  3. Problèmes avec un TWebBrowser dans une DLL
    Par bellamyjc dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/01/2005, 22h35
  4. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38
  5. [MFC] problème avec les insertions dans CComboBox
    Par Joeleclems dans le forum MFC
    Réponses: 12
    Dernier message: 11/06/2004, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo