如何使 postDelayed 按预期工作?

How to make postDelayed work as intended?

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

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

  1. http 请求的重点是 运行 后台的一项艰苦工作,这就是 AsyncTask 的设计目的。否则,您将在 Mainthread 上遇到 运行ning 网络请求异常,请 Google 了解更多。

  2. 关于 SwipeRefreshLayout,我认为它会自动显示加载动画,直到您调用 mSwipeLayout.setRefreshing(false)。所以这里有2种实现:

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

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

我稍后会用真实样本更新这个答案。但我希望你能明白这里的意思。