当前位置: 首页 > 知识库问答 >
问题:

PostDelayed和处理程序不工作,运行无延迟

萧和平
2023-03-14

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

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个答案

井修雅
2023-03-14

但当我运行应用程序时,所有gif加载速度非常快,所以我只能看到最后一个gif

因为您正在并行发布所有Runnable。

不使用for循环:

>

  • 创建处理程序实例:

    Handler handler1 = new Handler();
    

    为处理程序创建可运行:

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

    最后调用handler1.post延迟

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

    确保在组件暂停或停止时从Handler中删除所有回调:

    handler1.removeCallbacks(null);
    

  • 楚彦
    2023-03-14

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

    因此,将间隔乘以a,这样就可以放置50001000015000

    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);
            }
    
    顾嘉德
    2023-03-14

    您可以为此使用计时器

       // 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);
    
     类似资料:
    • 我正在尝试将我的UIAlertViews更改为UIAlertController。我为它设置了这个操作: 但是,处理程序直到动作被点击大约一秒钟后才运行。有什么方法可以加快速度吗?

    • 如何从Anable剧本和处理程序运行单个任务,并在该任务成功完成时收到通知,同时跳过相关剧本中的所有其他任务? 目前,我执行以下操作: 然后在任务完成后按Ctrlc。但是,这也将跳过处理程序。 我知道我可以给任务添加一个标签并使用它,就像在ansible playbook中如何只运行一个任务?,但我更希望能够在不添加标签的情况下做到这一点。这可能吗?

    • 我的RestController类: 我的ExceptionHandler: 例外响应:

    • 我正在写一个程序,显示如下所示的航班信息: 我的问题是使用方法时: 当正常运行时,由于某种原因它不会执行,但是当我使用调试器执行程序时,一切都执行得很好,我得到了一个有意义的输出(格式不是很好,但我可以使用),为什么会发生这种情况? 输出应该是这样的: 当我正常运行时,我会得到这个: 这是当我一步虽然(或运行调试): 我希望输出的是单步执行部分(稍后我将处理格式化) eddit:我已经在错误流中添

    • 我正在尝试设置与spring webflux安全自定义字符串消息,如果登录/注销成功或失败。除“AuthenticationFailureHandler”外,处理程序都在工作。 文档中提到了一些关于“logoutsuccessURL()”的内容,但它并不存在,并且这些处理程序返回的是mono 。 所以我有两个问题: > 如何返回一些字符串作为响应,例如,如果authenticaion失败,那么“无