我正在尝试使用滑动刷新布局来更新一些数据。所有工作正常,但一个小错误,我似乎无法解决
拖动以刷新时,动画冻结。
我是这样实现的:
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,效果相同。
有没有什么简洁的方法来实现这一点?我是否遗漏了一些细节?
我尝试了上面描述的步骤,我也在堆栈溢出上寻找类似的问题,但无济于事。
谢谢你!
1条答案
按热度按时间t9eec4r01#
在后台线程做刷新,在主线程做
setRefreshing(false)
是对的,问题是你忘了在新线程后调用start()。