android SwipeRefreshLayout动画冻结

mwkjh3gx  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(148)

我正在尝试使用滑动刷新布局来更新一些数据。所有工作正常,但一个小错误,我似乎无法解决
拖动以刷新时,动画冻结。
我是这样实现的:

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

也尝试了这个

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在等待这些东西完成,所以我尝试这样实现它:

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,效果相同。
有没有什么简洁的方法来实现这一点?我是否遗漏了一些细节?
我尝试了上面描述的步骤,我也在堆栈溢出上寻找类似的问题,但无济于事。
谢谢你!

t9eec4r0

t9eec4r01#

在后台线程做刷新,在主线程做setRefreshing(false)是对的,问题是你忘了在新线程后调用start()。

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

相关问题