0

所以这是我在大多数 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);
                }
            });
4

1 回答 1

1

您的评论的回复应该是一个答案。

  1. http请求的重点是在后台运行艰苦的工作,这就是 AsyncTask 的设计目的。否则,您将面临在主线程上运行网络请求的异常,请谷歌了解更多。

  2. 关于 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();
    }
});

以上只是关于应该在哪里做的想法,请自己尝试。

稍后我将使用真实示例更新此答案。但我希望你能明白这里的想法。

于 2015-04-02T00:47:03.430 回答