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 ()
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.
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() { } }
3 Réponses :
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?
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 () code> 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 () code >, 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é.
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
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
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.