为什么runOnUiThread对我有用,而Handler.post却没有

时间:2017-02-07 13:10:45

标签: android multithreading handler android-runonuithread

我的Fragment包含RecyclerView。在Fragment中,我从数据库加载一些数据,用{}填充RecyclerView,然后想要滚动到RecyclerView中的某个位置。

要在加载数据后在UI线程上执行滚动,我想使用处理程序:

public class MyFragment extends Fragment {
    private RecyclerView mRecyclerView;
    private mHandler Handler = new Handler();

    //....

    private void onDataAvailable() {
        // ...
        int scrollPosition = getScrollPosition();
        mHandler.post(new Runnable() {
            public void run() {
                mRecyclerView.smoothScrollToPosition(scrollPosition);
            }
        });

    }
}

然而,它永远不会向下滚动。

当我使用runOnUiThread时,一切正常:

public class MyFragment extends Fragment {
    private RecyclerView mRecyclerView;

    //....

    private void onDataAvailable() {
        // ...
        int scrollPosition = getScrollPosition();
        getActivity().runOnUiThread(new Runnable() {
            public void run() {
                mRecyclerView.smoothScrollToPosition(scrollPosition);
            }
        });

    }
}

无论我将mHandler实例化为new Handler()还是new Handler(Looper.getMainLooper()),它都无法正常工作。

我的理解是new Handler(Looper.getMainLooper())允许我在UI线程上执行任务,并且应该与runOnUiThread具有相同的效果。我的想法有什么不对?

更新

出于测试目的,我从onDataAvailable函数的末尾调用onCreateView并加载了模拟数据。相同的效果:使用我自己的处理程序,它无法滚动。使用runOnUiThread,它可以很好地工作。

更有趣的是,我从runnable外部为handler和runOnUiThread打印了线程ID。两次,代码都在线程1上运行,没有区别。

更新2

如果我使用mRecyclerView.scrollToPosition而不是smoothScrollToPosition,那么一切正常。知道那可能是什么吗?

0 个答案:

没有答案