2017-10-13 10 views
0

J'ai défini ce genre de classe Android Java, où la fonction native baresipStart() se termine jamais:ne répond plus après appel de la fonction C de Java fil

package com.tutpro.baresip; 

public class BaresipThread extends Thread { 

    public void start() { 
     baresipStart(); 
    } 

    public void kill() { 
     baresipStop(); 
    } 

    public native void baresipStart(); 
    public native void baresipStop(); 

} 

je puis appeler sa fonction start() d'une autre classe Java:

BaresipThread thread; 
thread = new BaresipThread(); 
thread.start(); 

le résultat est que la fonction baresipStart() commence à courir bien, mais reste de l'application ne répond plus.

Pourquoi est-ce et comment corriger le code afin que la fonction baresipStart() s'exécute en arrière-plan sans arrêter toutes les autres activités?

Répondre

1

Thread.start() est responsable de la création du nouveau thread d'exécution et de sa mise en marche. En l'écrasant comme vous l'avez fait, vous l'exécutez à la place baresipStart(), dans le thread qui appelle start(). Au lieu de redéfinir start(), vous devez remplacer run(). Cette méthode est ce qui définit le travail à effectuer dans le nouveau thread d'exécution.

En outre, si la méthode native baresipStart() revient à , jamais ne reviendra alors vous avez un problème. Votre application ne peut pas se terminer tant qu'elle a des threads actifs. Supposons que vous ayez l'intention de baresipStop() pour que le thread se termine, vous devez organiser baresipStart() pour renvoyer (ou pour lancer une exception non contrôlée) lorsque l'exécution est terminée par un appel de baresipStop(). Sachez toutefois que ces méthodes natives doivent être sûres pour les threads, car elles seront forcément appelées par différents threads Java.

0

Merci pour votre explication. Je suis le nouveau fil de baresip démarré en enlevant tout objet BaresipThread et en remplaçant les trois lignes ci-dessus avec celle-ci:

new Thread(new Runnable() { 
    public void run() { 
     baresipStart(); 
    } 
}).start(); 

L'utilisateur peut arrêter le processus résultant par l'intermédiaire de son interface utilisateur, après quoi l'application est terminée.