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 :

Bien quitter une sous activité


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut Bien quitter une sous activité
    Bonjour.

    Lorsque je quitte une sous activité et que j'essaye de la relancer, il plante.
    Afin de pouvoir quitter la sous activité depuis ma SurfaceView, j'utilise un système de request qui utilise la fonction (finish) dès que nécessaire.

    Cela fonctionne pour quitter, mais dès qu'il s'agit de recharger l'activité ( en en créant une nouvelle donc ), sa plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            for ( int cont = 0 ; cont < request.size() ; cont ++ ){
                if ( request.get(cont).equals("finish")){
                    ( (Activity)getContext()).onBackPressed();
                }
           }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        @Override
        public void onClick(View v) {
     
            if (v.getId() == R.id.buttonNew )
            {
                Bundle extra = new Bundle();
                extra.putString("map", "map0");
                Intent intent = new Intent(this, GameActivity.class);
                intent.putExtras(extra) ;
                startActivityForResult(intent, 1);
            }
    Avez vous une idée de ce qui ne va pas ?
    Merci.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    d'autre part, une chose étonnante.

    j'ai crée 3 sous activité, dont une qui sert a lire et charger les fichiers, nommée "FileActivity".
    Si j'utilise cette activité, pour lancer le jeu ( la sous activité qui contient la surfaceView ), puis quitte le jeu et y revient, puis relance le jeu a nouveau, il plante et me renvoi sur l'activité pricinpale ( MainActivity ).
    Alors je lance l'Activité "FileActivity" et relance le jeu et ca marche.

    En revanche, si j'effectue la même manip en lançant je jeu directement depuis le "MainActivity", lorsque je reviens sur l'activité et relance le jeu, il plante et quitte tout pour revenir au menu du Smartphone.

    Est-ce que ca peu venir de la façon dont je quitte la surfaceView, ou le Threadh ?
    Il y a-t-il des methodes particulières a faire dans ce cas là ?

    Merci si vous pouvez m'aider.

  3. #3
    Membre confirmé Avatar de smartties
    Homme Profil pro
    Dev
    Inscrit en
    Février 2010
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Février 2010
    Messages : 222
    Points : 496
    Points
    496
    Par défaut
    Impossible de determiner d'où vient le problème avec le peu d'information que tu donne.
    Il faudrait que tu nous montre au moins le logcat, et au mieux le code de ta custom surfaceview.

    Mais allez, je vais tenter ma chance. J'imagine que tu dois lancer un Thread dans ta SurfaceView que tu oublie de stopper/détruire quand ta SurfaceView se met en pause/est détruite.

    Bonne continuation

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Merci, Smartties, pour ta réponse.

    Effectivement, je lance un threadh dans la surfaceView.
    J'ai essayé de le détruire, mais la fonction "stop", est rayée, ( je ne vois pas pourquoi ).
    Si je met setRunning(false), ca ne change rien.

    Voici ma surfaceView :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
     
    public class GameSurface extends SurfaceView implements SurfaceHolder.Callback
    {
     
        private GameTread gameTread ;
        public SurfaceHolder holder ;
        Rect rect ;
        Paint paint ;
        public GameSystem gameSystem ;
     
        ArrayList<String> request ;
     
        int dX = 0, dY = 0 ;
        float x, y ;
        boolean refreshOk = false ;
     
     
        Context c;
     
        public GameSurface(Context context, String word, int u )
        {
            super(context);
            c = context;
            gameTread = new GameTread(this);
            holder = getHolder();
            holder.addCallback(this);
            paint = new Paint();
            paint.setColor(Color.BLUE);
            request = new ArrayList<String>();
            gameSystem = new GameSystem( request, word, u ) ;
            rect = new Rect();
            rect.set(0,0,10,10);
            x = 0 ; y = 0 ;
        }
     
        public void draw(Canvas canvas)
        {
            if (holder!=null)
            {
                Canvas ccc = holder.lockCanvas();
                if (ccc!=null)
                {
                    ccc.drawRect(rect, paint);
                    gameSystem.update(ccc) ;
                    gameSystem.drawHUD(ccc);
                    holder.unlockCanvasAndPost(ccc);
                }
            }
        }
     
        @Override
        public void surfaceCreated(SurfaceHolder holder)
        {
            if(gameTread.getState()==Thread.State.TERMINATED)
            {
                gameTread = new GameTread(this);
            }
            try
            {
     
            }
            catch ( Exception e)
            {
                e.printStackTrace();
            }
            gameTread.setRunning(true);
        }
     
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
        {
            rect = new Rect(0,0,width,height);
            gameSystem.init(c, width, height) ;
            gameTread.start();
        }
     
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }
    }
    ( j'ai juste enlevé la class OnTouchEvent pour alléger le code )


    Et voici mon 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
    public class GameTread extends Thread
    {
     
        public GameSurface gameSurface ;
     
        private final static int FRAMES_PER_SECOND = 30 ;
     
        private boolean running = false;
        private long timer ;
        private int timeTip ;
        private Canvas c ;
        private long lastTime;
     
        GameTread(GameSurface gf)
        {
            gameSurface = null;
            gameSurface = gf ;
            timer = 0 ;
            timeTip = 0 ;
            c = null ;
        }
     
     
        public void setRunning(boolean run)
        {
            running = run;
        }
     
        @Override
        public void run()
        {
            while (running)
            {
                timeTip = 0 ;
                long currentTime = System.nanoTime();
                timer += currentTime ;
                if ( timer >= 100000000.0 )
                {
                    timeTip = 2 ;
                    timer = 0 ;
                }
                float seconds = (float) (( currentTime - this.lastTime ) / 1000000000.0);
                this.lastTime = currentTime ;
     
     
     
                gameSurface.draw(c) ;
     
                for ( int cont = 0 ; cont < gameSurface.request.size() ; cont ++ ){
                    if ( gameSurface.request.get(cont).equals("finish")){
                        gameSurface.surfaceDestroyed(gameSurface.holder);
                        runing = false ;
                        ( (Activity)gameSurface.getContext()).finish();
                    }
                }
            }
     
        }
    }

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Autre chose.
    Si je teste cette même appli dirrectement sur un smartphone, ce bug ne semble plus s’opérer.

Discussions similaires

  1. Quitter une sous-application
    Par mazertys17 dans le forum Android
    Réponses: 4
    Dernier message: 13/07/2015, 11h00
  2. Réponses: 7
    Dernier message: 30/05/2007, 14h15
  3. Requete avec une sous-requete... Ne fonctionne qu'a moitie..
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 18/08/2003, 09h54
  4. Réponses: 3
    Dernier message: 18/05/2003, 00h16
  5. Quitter une application FLASH ?
    Par jeje.r dans le forum Flash
    Réponses: 3
    Dernier message: 25/02/2003, 14h57

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