0
votes

Comment effectuer une action après le démarrage et l'affichage de l'activité

J'ai deux activités. A et B . A démarre B .

Dans B.onCreate () j'appelle une fonction pour télécharger un fichier dont j'ai besoin dans cette activité: DownloadFile () .

Pour cela, B a une barre de progression que je cache dès que le téléchargement est terminé.

Ce que je la progression attendue était la suivante:

  • A appelle startActivity()
  • B s'affiche
    • B affiche la progressbar
    • B appelle onCreate
    • B.DownloadFile () s'appelle
    • B masque progressBar

Mais ce qui se passe réellement est:

  • A appelle startActivity ()
    • L'écran est bloqué sur A
    • B appelle onCreate
    • B.DownloadFile () est appelé
    • B n'affiche jamais progressBar
  • B est affiché, fichier déjà téléchargé, masquant immédiatement la barre de progression.

Maintenant, quand j'ai fait la même chose dans la même progression mais au lieu de télécharger le fichier, je l'ai diffusé en streaming, tout a bien fonctionné. Mais cela pourrait avoir quelque chose à voir avec la façon dont MediaPlayer gère les choses.

J'ai essayé de basculer onCreate pour onStart ou onResume d'après ce que j'ai vu sur cette réponse . Mais la même chose se produit.

Je veux changer d'activité et seulement après B est affiché, je veux que le téléchargement démarre, mais je ne sais pas comment.

Modifier

Comme demandé, le code pour B

package com.skillcademy360.lite.activities

import android.os.Bundle
import android.support.v7.app.AppCompatActivity

class DownloadActivity: AppCompatActivity() {
    override fun onResume(savedInstanceState: Bundle?) {
        super.onResume(savedInstanceState)
        DownloadFile()
    }

    fun DownloadFile() {
    }
}

Comme je l'ai dit, j'ai déjà essayé pour basculer onCreate pour onStart et onResume et même onPostCreate , qui ne devrait pas être utilisé de toute façon. Mais aucun d'entre eux ne fonctionne.

EDIT:

Je me rends compte qu'il existe des moyens de contourner ce problème, mais j'ai besoin d'un moyen direct. Tout cela est lié à un héritage et à une bibliothèque, donc faire des choses comme "enregistrer le fichier comme une variable globale" ne fera pas l'affaire.

Le code que j'ai fourni ci-dessus se comporte de la même manière que le mien, donc J'ai besoin de ce problème exactement résolu sans avoir de solution de contournement en utilisant AsyncTasks ou des variables globales.

EDIT: Clarifier. Je comprends cela, quand je l'appelle dans onCreate , le DownloadFile () bloque l'interface utilisateur. Cependant, comme indiqué ci-dessous, la même chose se produit lorsque je l'appelle dans onResume . Si je comprends bien, et comme il est écrit dans le cycle de vie , le cycle de vie visible devrait commencer après onStart , mais il ne semble pas le faire.

package com.skillcademy360.lite.activities

import android.os.Bundle
import android.support.v7.app.AppCompatActivity

class DownloadActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DownloadFile()
    }

    fun DownloadFile() {
    }
}


5 commentaires

pouvez-vous fournir des activités B sur le code de création


Veuillez partager votre code, je pense, vous appelez DownloadFile dans votre oncreate (), changez-vous l'emplacement de DownloadFile () de onCreate () à onStart ()?


montrez-nous du code, nous ne pouvons pas le deviner.


Ou modifiez-vous l'emplacement de la méthode DownloadFile () de onCreate () à onResume ()?


J'ai ajouté le code mais c'est très simple, donc je ne sais pas si cela aide.


3 Réponses :


0
votes

Ce que vous pouvez faire est de créer la barre de progression dans l'activité A, de sorte que vous soyez sûr qu'elle est appelée lorsque votre intention commence. Téléchargez le fichier en B et annulez-le uniquement.

Pouvez-vous s'il vous plaît montrer du code s'il ne fonctionne toujours pas comme ça? Que se passe-t-il si vous utilisez le mode débogage?


0 commentaires

2
votes

Selon Cycle de vie des activités :

onStart () appelé lorsque l'activité devient visible pour l'utilisateur. Suivi par onResume () si l'activité vient au premier plan, ou onStop () si elle devient masquée.

Vous pouvez essayer d'appeler votre méthode DownloadFile () en créant un arrière-plan Thread (le téléchargement ne pouvait donc pas bloquer l'interface utilisateur) dans B Activity onCreate () et commencez à afficher votre ProgressBar dans onResume () ou dans onStart () .

MODIFIER : jetez un œil à ce post

EDIT 2 : si vous ne souhaitez pas travailler avec une variable globale, vous pouvez appeler votre méthode DownloadFile () dans onCreate () , affichez ProgressBar puis faites tout votre travail onPostDelayed () , y compris la suppression de ProgressBar

EDIT 3 : vous ne pouvez probablement pas afficher la ProgressBar animée pendant que vous téléchargez le fichier sur le même Thread car votre téléchargement bloquera toute l'interface utilisateur.

MODIFIER 4 :

  • La vraie progression de vos actions est la suivante:

    A appelle startActivity()

    • La méthode onCreate () est appelée dans B

    ProgressBar est configuré dans onCreate () mais ne sera affiché que dans onResume()

    • La méthode DownloadFile () a démarré et bloqué toute l'interface utilisateur

    • Les méthodes onStart () et onResume () n'ont pas été appelées à cause de DownloadFile () en cours d'exécution. C'est pourquoi vous êtes resté sur l'écran de Activité A

    DownloadFile () est terminé, les méthodes onStart () et onResume () ont été appelés. ProgressBar est ignoré.


12 commentaires

J'utilise mon fichier téléchargé dans la méthode onPostCreate afin qu'il ne puisse pas vraiment le faire de manière asynchrone. Ou du moins, cela créerait une surcharge importante. Comme vous l'avez suggéré, à "onStart", il devrait déjà être visible, donc j'aimerais le faire de cette façon.


Créez simplement la variable globale de votre fichier objet . Téléchargez-le en arrière-plan Thread et initialisez ce vairable quelque part dans onSuccessDownload () . Ensuite, utilisez cet objet couramment après onCreate ()


J'ai également mis à jour ma réponse, jetez un œil à ce post.


Je considère toujours toutes ces solutions de contournement mais ce n'est pas ainsi que l'activité est censée fonctionner, n'est-ce pas? Je veux dire, j'aurais pu trouver comment le faire avec AsyncTask mais j'en ai déjà beaucoup et comme vous l'avez dit vous-même, onStart et onResume est censé s'appeler < i> après l'activité est visible. Je souhaite résoudre ce problème directement . Et je veux comprendre pourquoi cela se produit.


Que voulez-vous dire sous ce n'est pas ainsi que l'activité supposée fonctionner ? Votre attente de suivre la progression après startActivity () était erronée. L'activité se comporte comme elle le devrait. Vous ne pouvez pas afficher ProgressBar dans onCreate . Vous pouvez le configurer ici, mais il sera affiché dans onResume . L'appel de DownloadFile bloque l'intégralité de votre interface utilisateur, c'est pourquoi vous restez à l'écran précédent jusqu'à ce que le chargement soit terminé.


Non, il ne s'agit pas de la barre de progression. Il s'agit de toute l'activité. L'application n'affiche même pas un "écran noir" ou quoi que ce soit, elle montre l'ancienne activité A . Même si je fais mon téléchargement dans onResume . La "durée de vie visible" est censée se situer après onStart , donc je m'attendrais au moins à ce que l'activité change après l'appel de onStart . Ainsi, lorsque onResume est atteint, n'est-il pas censé être déjà visible?


Mais j'ai essayé la même chose avec onResume et cela ne fonctionne pas non plus. Ne devrait-il pas?


Si vous affichez votre ProgressBar dans onResume () puis appelez DownloadFile () , votre écran sera également gelé. La seule différence est que vous aurez un écran gelé de l ' Activité B avec une image ProgressBar arrêtée dessus.


Mais c'est exactement mon problème: cela ne se produit pas. Au lieu de voir une ProgressBar gelée, je vois l'activité A .


Pouvez-vous fournir votre tentative de l'appeler dans onResume () ?


Veuillez oublier la ProgressBar. Il ne s'agit pas de ProgressBar. Il s'agit de ne pas afficher l'activité du tout avant la fin du téléchargement.


Je vous avais conseillé d'ajouter des journaux dans tous les états du Cycle de vie des activités . De onPause () de Activité A à onStop () de Activité B . Cela nous aide vous et moi à comprendre la situation



0
votes

Vous pouvez essayer d'utiliser AsyncTask, afficher votre progressBar dans la méthode onPreExecute (), télécharger votre fichier dans doInBackground () et masquer la barre de progression dans onPostExecute (),

Ensuite, vous pouvez exécuter cette AsyncTask à partir de la méthode onCreate () de votre activité B.

J'espère que cela vous aidera.

Ankit Dubey


0 commentaires