11
votes

La barre de progression indéterminée ne s'affiche pas pendant l'opération d'asyncaptage

J'ai un fichier GoogleTranslate.java qui a une classe, GoogleTranslate, qui s'étend AsyncTask. Le but de cette tâche est d'effectuer des traductions Google.

J'ai une autre classe, MyVocab, qui permet à l'utilisateur d'entrer un mot à traduire dans une boîte de dialogue d'alerte. Donc, un clic sur le bouton de dialogue d'alerte, le mot sera traduit dans la langue souhaitée en appelant la classe GoogleTranslate. Cependant, quand je passe une barre de progression de MyVocab à GoogleTranslate il ne fonctionne pas. Lorsque l'opération est en cours d'exécution (pour un montant observable du temps), la barre de progression ne se présente pas. Je mets la barre de progression VISIBLE dans OnPreExecute et le définir comme GONE dans onPostExecute. P>

Je me demande si c'est parce que je GoogleTranslate et MyVocab dans deux fichiers java différents puisque la plupart des exemples que je vois ont la classe et la classe async qui l'appelle dans le même fichier java. S'il vous plaît laissez-moi savoir s'il y a quelque chose que je fais mal qui cause ce problème p>

Voici le code correspondant. P>

GoogleTranslate.java p>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Vocab"
    android:id="@+id/vocabInput"
    android:inputType="textAutoComplete"/>

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Definition"
    android:id="@+id/definitionInput"
    android:inputType="textAutoComplete"
    android:layout_below="@+id/vocabInput"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="gone"
    android:indeterminate="true"
    android:id="@+id/progressBar"/>


10 commentaires

Votre premier dialogue est-il toujours visible alors que la tâche ASYNC fait son travail?


Yup c'est toujours visible. Lorsque je clique sur le bouton "Traduire" (Neutre), il semble rester enfoncé (le bouton contient des nuances qui indiquent être enfoncées) jusqu'à ce que l'opération de traduction soit terminée. La boîte de dialogue est conçue pour rester ouverte pendant et après l'opération de traduction.


Un chèque rapide (stupide): votre thème est-il coloraccent différent de votre arrière-plan de la barre de progression? Parce que la barre de progression de la barre de valeur est coloracente ...


Ouais! J'ai été capable de le faire montrer si je viens de définir la barre de progression visible sans jamais le régler ou invisible, donc ce n'est pas le problème. Merci pour votre contribution!


Je viens de tester votre classe GoogletRanslate et que la barre de progression fonctionne parfaitement pour moi. Au début, je n'ai pas vu les progrès parce que j'avais une exception si la tâche s'est terminée immédiatement. Afin de voir la barre de progression quand même, je viens d'ajouter un délai dans la post-exécution: Vide protégé de @override surpostexecute (chaîne s) {nouveau gestionnaire (). PostDelayed (nouveau runnable () {@override public vide annulation ( ) {mprogressar.setVisibilité (vue.gone);}}, 3000); } Pouvez-vous essayer ceci afin d'exclure que la tâche est de rapide?


Bonjour Federico, merci pour votre temps! J'ai effectivement utilisé le paramètre de connexion Internet la plus lent dans mon émulateur (essayé deux émulateurs différents) afin que l'opération prend au moins 3 ou 4 secondes à exécuter. Cependant, cela n'a toujours rien montré. Lorsque le processus fonctionne pendant cette période de temps, le bouton reste légèrement grisé et semblait être poussé pendant la durée de l'opération de traduction.


La barre de progression fonctionne donc parfaitement pour vous maintenant? Il apparaît lorsque vous touchez le bouton et disparaît lorsque l'opération est terminée?


En fait, je venais de nouveau l'opération, il faut au moins 6 à 7 secondes pour que l'opération de traduction soit terminée.


Et je viens de mettre à jour le code de sorte qu'il passe la barre de progression à l'aide du constructeur de classe GoogletRanslate à la place. Toujours aucune différence pour les résultats BTW.


Et je ne suis pas sûr de savoir pourquoi, mais il semble que je puisse installer directement la visibilité de la barre de progression (juste pour les tests) en dehors de la méthode OnClick, mais pas de cela.


6 Réponses :


4
votes

Ajoutez ceci avant d'exécuter le googlettranslate : xxx

et implémentez également le tinprogresspdate dans googuTranslate .

Ce lien peut aider:

http://www.concreepage.com/android/androïd-asynccTask-example-with-progress-bar


4 commentaires

Merci pour votre participation. Cependant, lorsque j'ai ajouté les deux lignes de code comme vous l'avez suggéré, rien ne change. Je viens de poster mon fichier XML pour la boîte de dialogue d'alerte contenant la barre de progression. C'est une barre de progression circulaire (Nondéterminée) qui est la raison pour laquelle je n'ai pas implémenté surprogressumdate. Dois-je encore mettre en œuvre ONPROGRESSUPDATEDATE dans ce cas? Parce que l'exemple fourni, je pense que c'est pour une barre de progression déterminée. Merci!


Ajoutez-vous `Android: indéterminé =" vrai "` à votre XML pour la barre de progression?


Je ne l'avais pas auparavant, mais même quand je l'ajoute maintenant, il n'y a pas de changements. Au fait, avec mon XML actuel (avec ou sans indéterminé = "true"), en définissant sa visibilité par défaut à "visible" dans le XML aura la barre de progression indéterminée montrée comme je le souhaite, donc le problème est simplement avec contrôler le calendrier qu'il apparaît. Merci pour ton aide!


Je pense que cela est possible que, puisque Java passe de valeur que la façon dont je définissais la barre de progression en le faisant dans la classe GoogletRanslate est incorrecte. Toujours expérimenter de différentes manières



5
votes

Je suggérerais d'utiliser ProgressDialog code> à la place.

i commuté de ProgressBar code> Parce que je suis confronté à un problème similaire, même après la création de manière programmée dans le constructeur par défaut de mon AsynccTask Code>. P>

new GoogleTranslate(getActivity() /* or getContext() */).execute(vocab, source, target);


3 commentaires

Merci pour votre suggestion! En fait, je pensais aussi à cette option. Toutefois, le document officiel Android indique "Éviter ProgressDialog | Android inclut une autre classe de dialogue appelée progresssialog qui affiche une boîte de dialogue avec une barre de progression. Toutefois, si vous devez indiquer des progrès de chargement ou indéterminé, vous devez suivre les directives de conception pour l'avancement et l'activité. et utilisez une barre de progression dans votre mise en page. " Donc, je vois si je peux toujours continuer avec ProgressBar à moins qu'il n'y aient aucun moyen de le réparer. Merci encore!


@Charles Li Eh bien, la documentation Android ne sont que des lignes directrices à suivre. J'étais bloqué pendant 3 jours d'essayer de résoudre le problème de la barre , jusqu'à ce que j'ai finalement décidé d'aller avec ProgressDialog (j'ai lu la documentation et j'ai eu les mêmes pensées que vous le faites maintenant) . Je vous suggère d'attendre quelques jours, si vous ne trouvez toujours pas une solution qui fonctionne, allez avec progressdialog :)


Ouais! C'est ce que j'ai à l'esprit aussi! Ceci est mon dernier effort pour trouver une solution. lol merci beaucoup pour votre contribution!



3
votes

Essayez de passer de la barre de progression comme argument de constructeur de la classe GoogleTranslate.


1 commentaires

J'ai essayé de faire ça, mais ça ne marche toujours pas. Merci tho!



2
votes

C'est parce que vous bloquez le thread principal par asynckTask.get () appel, aucune opération d'interface utilisateur ne peut exécuter jusqu'à ce que l'ASYNCCTASS est terminé.

Supprimer cet appel et traiter les résultats de l'asyncaptage dans son Onpostexecute (String S) et Oncanceled () Callbacks à la place.


0 commentaires

4
votes

Essayez d'éviter la méthode d'obtention d'asynctaque () et d'utiliser un auditeur à la place. Vous devez mettre à jour votre code de cette façon:

1) dans votre classe GoogletRanslate, ajoutez un auditeur: p> xxx pré>

et appelez-le dans votre surpostexecute: p>

googleTranslate.setListener(new GoogleTranslate.Listener() {
            @Override
            public void onTaskResult(String string) {
                    String translatedJSON = string;
                    JSONParser jsonParser = new JSONParser();
                    String translatedText = jsonParser.parseJSONForTranslation(translatedJSON);
                    definitionInput.setText(translatedText);
            }
        });
        googleTranslate.execute(vocab, source, target);


1 commentaires

Merci beaucoup pour votre aide tout au long de cette époque, Federico! M'a pris du temps pour comprendre votre code mais cela a du sens pour moi maintenant et ça marche! Maintenant, j'ai besoin de chercher un air plus profond dans asyncktask.get! Merci encore!



3
votes

Ajoutez une barre de progression dans votre méthode onpexecute et cachez-la dans Onpostexecute. XXX


0 commentaires