安卓:Viewpager的OnPageChangeListener.onPageSelected干扰滑动动画

3

我在这里看到了一些类似的帖子,但没有合适的回答。

我使用视图页 viewpager 中的事件 onpageselected 来执行一个函数。这个函数依赖网络,可能需要一些时间。但是,滑动动画会变得卡顿。

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i2) {

            }

            @Override
            public void onPageSelected(int i) {
                makeSomeHeavyTask();
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

重要任务:

public void makeSomeHeavyTask() {
        handler.post(new QueryRunnable());

    }

有没有解决这个问题的方法?谢谢。

有没有可能让我们看到代码? - Uxonith
2
你是否在单独的线程中执行“heavyTask”,而不影响主UI? - Martin Cazares
@MartinCazares 这就是我询问的那段代码 :) - Uxonith
是的,它应该在单独的线程中。 - user2212461
如果handler是在mainLooper上创建的(例如在Activity / Fragment中),则handler.post(new QueryRunnable());不会在另一个线程上运行QueryRunnable()。 - Patrick
2个回答

1
使用AsyncTask进行繁重任务。请参考此处的被接受的答案AsyncTask: where does the return value of doInBackground() go?编辑:首先需要在getView中返回一个占位符。如果getView方法必须等待线程完成,那么动画肯定会滞后。稍后可以使用返回的占位符在线程完成后进行发布。

我已经通过我的Handler在另一个线程中完成了它(请参见函数makesomeheavytask())。有没有一种方法可以在异步任务中执行滑动动画?! - user2212461
动画只能在 UI/主线程中完成。其他所有工作都可以转移到线程中执行。 - Shakti
那只有在你的重任务不涉及UI时才有效,如果你想在页面更改时更改视图,那就没戏了。 - Patrick

0

你可以使用回调函数

public void onPageScrollStateChanged(int i)

用以下代码替换 public void onPageSelected(int i)

if(i == ViewPager.SCROLL_STATE_IDLE) {
    //your task
}

如果你有一个无法在不同的线程上执行的任务。这个任务将在动画完成之后被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接