所以这里是我在SwipeRefreshLayout的大多数教程中找到的方法,但它对我来说似乎完全是愚蠢的。
它的作用:它在实际执行doStuff()之前的2000毫秒内执行刷新动画。
我(显然!!)想要做的事情:刷新动画,然后doStuff()然后停止。无需计时器!难道我做错了什么 ?互联网告诉我没有...
view.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
swipeEmptyView.setRefreshing(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doStuff();
swipeEmptyView.setRefreshing(false);
}
}, 2000);
}
});
答案 0 :(得分:1)
您的评论回复应该是一个答案。
http请求的要点是在后台运行一项艰苦的工作,这就是AsyncTask的设计目标。否则,您将面临在Mainthread上运行网络请求的例外情况,请Google知道更多信息。
关于SwipeRefreshLayout,我认为它会自动显示加载动画直到您调用mSwipeLayout.setRefreshing(false)。所以这里有两种实现方式:
2.1 - 使用AsyncTask获取http请求,使用您自己的加载动画(使用或不使用SwipeRefreshLayout):
public class MyAsyncTask<DummyStuff> extends AsyncTask<Void, Void, Void> {
public void onPreExecute() {
// start your animation here
// NOTE: if you use SwipeRefreshLayout, it will automatically show animation when you swipe your layout down, so please consider your UX to do what you want.
}
public void onDoinBackground(Void... input) {
// do something
// http request or something
return null; // return what ever you get
}
public void onPostExecute(Void... result) {
// stop your animation here
// in case you use SwipeRefreshLayout, call mSRL.setRefreshing(false) here too.
}
}
2.2用户使用您的SwipeRefreshLayout上面的任务:
我只会展示重要的部分:
mSRL.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
(new MyAsyncTask()).execute();
}
});
以上只是关于应该在哪里做的想法,请亲自尝试。
我将在稍后用真实样本更新此答案。但我希望你能在这里得到这个想法。