PostDelayed 和 Handler 不工作并且 运行 没有延迟

PostDelayed and Handler not working and run with no delay

我的 android 项目的可绘制资源文件夹中有一个动画 gif 列表。 我需要一张一张地播放这些 gif,等待几秒钟,然后播放下一张 gif。 但是当我 运行 应用程序时,所有 gif 加载速度都非常非常快,所以我只能看到最后一个 gif。 我使用 Glide 播放 gif,这是我的代码

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);
}

我想你希望你的每个 gif 播放间隔 5000

所以将你的间隔乘以 a 这样你就可以放置 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);
        }

您可以为此使用计时器

   // 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);

but when I run the app, all gifs load very very fast so I can just see the last gif

因为您并行发布所有 Runnable。

不使用 for 循环:

  1. 创建处理程序实例:

    Handler handler1 = new Handler();
    
  2. 为处理程序创建可运行对象:

    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);
    
                }
            }
        };
    
  3. 最后调用handler1.postDelayed

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

确保在组件暂停或停止时从处理程序中删除所有回调:

handler1.removeCallbacks(null);