1
votes

PostDelayed et Handler ne fonctionnent pas et s'exécutent sans délai

J'ai une liste de gifs animés dans le dossier de ressources dessinables dans mon projet Android. J'ai besoin de ces gifs lus un par un, attendez quelques secondes, puis lisez le gif suivant. mais quand j'exécute l'application, tous les gifs se chargent très très rapidement pour que je puisse juste voir le dernier gif. J'ai utilisé Glide pour jouer aux gifs et voici mon code

Handler handler1 = new Handler();        

for (int a = 1; a<=lines.size() ;a++) {
    handler1.postDelayed(new Runnable() {

        @Override
        public void run() {
            String resName = "";
            int duration = 0;
            resName = "wo_" + (lines.get(slideIndex).split(",")[0]).toLowerCase().trim().replace(".gif", "");
            duration = Integer.parseInt(lines.get(slideIndex++).split(",")[2].trim());
            int resourceId = getResId(resName, R.drawable.class);//this.getResources().getIdentifier(resName, "drawable", this.getPackageName());

            Glide.with(WorkoutActivity.this).asGif().load(resourceId).into(imageView);
        }
    }, 5000);
}


6 commentaires

Vous pouvez écrire Thread.sleep (5000); au lieu de Handler


@AndroidPlayer_Shree non, en utilisant le sommeil, l'interface utilisateur se fige


@ MH2538: Pour obtenir le même besoin de publier le prochain exécutable lorsque le premier est terminé, vous publiez actuellement en parallèle


@ ρяσѕρєяK pouvez-vous me donner un échantillon, s'il vous plaît


comme cette mention dans le gestionnaire, comme votre code, tout retardera pendant 5 secondes (ou juste quelques millisecondes de boucles for) car comme mentionné dans la documentation Provoque l'ajout du Runnable r à la file d'attente des messages, à exécuter après le laps de temps spécifié s’écoule. L'exécutable sera exécuté sur le thread auquel ce gestionnaire est attaché. La base de temps est SystemClock.uptimeMillis (). Le temps passé en sommeil profond ajoutera un délai supplémentaire à l'exécution.


@ MH2538: vous pouvez également le faire sans boucle for. en utilisant temp ArrayList et ListIterator pour lignes


3 Réponses :


0
votes

Je pense que vous vous attendez à ce que chaque gif soit joué dans l'intervalle 5000

alors multipliez votre intervalle par a pour pouvoir placer 5000,10000,15000

Handler handler1 = new Handler();
        for (int a = 1; a<=lines.size() ;a++) {
            handler1.postDelayed(new Runnable() {

                @Override
                public void run() {
                    String resName = "";
                    int duration = 0;
                    resName = "wo_" + (lines.get(slideIndex).split(",")[0]).toLowerCase().trim().replace(".gif", "");
                    duration = Integer.parseInt(lines.get(slideIndex++).split(",")[2].trim());
                    int resourceId = getResId(resName, R.drawable.class);//this.getResources().getIdentifier(resName, "drawable", this.getPackageName());

                    Glide.with(WorkoutActivity.this).asGif().load(resourceId).into(imageView);
                }
            }, a * 5000);
        }


0 commentaires

1
votes

Vous pouvez utiliser Timer pour cela

   // Declare globally
private int position = -1;

/**
 * This timer will call each of the seconds.
 */
Timer mTimer = new Timer();
mTimer.schedule(new TimerTask() {
    @Override
    public void run() {
        // As timer is not a Main/UI thread need to do all UI task on runOnUiThread
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                    // increase your position so new image will show
                position++;
                // check whether position increased to length then set it to 0
                // so it will show images in circuler
                if (position >= imageArray.length)
                    position = 0;
                // Set Image
                MyImageView.setImageResource(imageArray[position]);
            }
        });
    }
}, 0, 5000);


0 commentaires

-1
votes

mais lorsque j'exécute l'application, tous les gifs se chargent très très rapidement pour que je puisse juste voir le dernier gif

Parce que vous publiez tous les Runnables en parallèle.

Faites-le sans boucle for:

  1. Créer une instance de gestionnaire:

    handler1.removeCallbacks(null);
    
  2. Créer un exécutable pour le gestionnaire:

    ArrayList<?> tempLinesArray=new ArrayList<>();
    tempLinesArray.addAll(lines);
    handler1.postDelayed(mRunnable,5000);
    
  3. Enfin, appelez handler1.postDelayed :

    Runnable mRunnable=new Runnable() {
            @Override
            public void run() {
                ListIterator<?> iter = tempLinesArray.listIterator();
                if(iter.hasNext()){
                    ? str = iter.next(); // item from lIst
                    // do your work here
                    ....
                    iter.remove(); // remove item from list.
                    Glide.with(WorkoutActivity.this).asGif().load(resourceId).listener(new RequestListener<GifDrawable>() {
                        ...
                        @Override
                        public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
                            handler1.postDelayed(mRunnable,5000);
                            return false;
                        }
                    }).into(imageView);
    
                }
            }
        };
    

Assurez-vous de supprimer tous les rappels du gestionnaire lorsque le composant est en pause ou à l'arrêt:

Handler handler1 = new Handler();

0 commentaires