首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwipeRefreshLayout动画冻结

SwipeRefreshLayout动画冻结
EN

Stack Overflow用户
提问于 2022-11-26 13:44:57
回答 1查看 36关注 0票数 0

我试图使用刷刷新布局来更新一些数据。除了一个我似乎解决不了的小错误外,一切正常。

当我拉到刷新时,动画就被冻结了。

我是这样实施的:

代码语言:javascript
复制
myRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        // Do some stuff
        // Sleep as a demonstrator of the issue
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        myRefreshLayout.setRefreshing(false);
    }
});

也尝试过这样做:

代码语言:javascript
复制
myRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        myRefreshLayout.post(new Runnable() {
            @Override
            public void run() {
                // Do some stuff
                // Sleep as a demonstrator of the issue
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        myRefreshLayout.setRefreshing(false);
                    }
                });
            }
        });
    }
});

但是动画一直被冻结,直到一切都完成,然后它就消失了(因为它击中了setRefreshing(false))。

在搜索了一点之后,我想可能是UI在等待这些东西完成,所以我尝试以如下方式实现它:

代码语言:javascript
复制
myRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // Do some stuff
                    // Sleep as a demonstrator of the issue
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            myRefreshLayout.setRefreshing(false);
                        }
                    });
                }
            });
        }
    });
}

在这种情况下,刷新指示符永远不会消失,所以我想它不是调用runOnUiThread,而是用主活套(处理程序)而不是具有相同效果的runOnUiThread调用相同的东西。

有什么简单的方法来实现这一点吗?我是不是漏掉了一些细节?

我尝试了上面描述的步骤,我还查看了Stack溢出类似的问题,但都没有效果。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-11-26 15:53:24

对后台线程执行刷新操作,在主线程上执行setRefreshing(false)操作是正确的。问题是,您忘记在新线程之后调用start()。

代码语言:javascript
复制
myRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // Do some stuff
                    // Sleep as a demonstrator of the issue
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            myRefreshLayout.setRefreshing(false);
                        }
                    });
                }
            }).start();// start the thread here
        }
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74582709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档