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); }
3 Réponses :
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); }
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);
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:
Créer une instance de gestionnaire:
handler1.removeCallbacks(null);Créer un exécutable pour le gestionnaire:
ArrayList<?> tempLinesArray=new ArrayList<>(); tempLinesArray.addAll(lines); handler1.postDelayed(mRunnable,5000);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();
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
pourlignes