Sqlite错误:只有创建视图层次结构的原始线程才能触及其视图

时间:2016-04-27 03:42:21

标签: java android multithreading android-recyclerview

我试图了解下面错误的原因以及如何解决它。

  

只有创建视图层次结构的原始线程才能触及它   视图。

这是我的代码段。

public void refreshMyRecyclerView() {
    new Thread(new Runnable(){
        @Override
        public void run(){
            mValueList = mMyDatabase.fillValueList(); //pulls data from sqlite db
            mRecyclerAdapter = new MyRecyclerAdapter(getActivity(), mValueList);
            mRecyclerView.setAdapter(mRecyclerAdapter); //error on this line
        }
    }).start();

}

我试图通过执行SQLite读取UI线程来遵循良好实践。但是我遇到了类似于上面的错误的奇怪错误,即使在阅读了涉及相同错误描述的类似问题之后我也不知道是什么导致错误。

1 个答案:

答案 0 :(得分:2)

您应该只访问UI组件,例如UI线程中的视图。正如您所发现的,如果您尝试从后台线程访问它们,您将收到错误。

您可以在后台线程上读取数据库中的值,但是您应该在UI线程上填充并设置适配器。如果您在Activity,则可以使用方法runOnUiThread(...)。否则,如果片段getActivity().runOnUiThread(...)mRecyclerView.post(...)也可以使用。所有方法都采用Runnable

public void refreshMyRecyclerView() {
    new Thread(new Runnable(){
        @Override
        public void run(){
            mValueList = mMyDatabase.fillValueList(); //pulls data from sqlite db
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mRecyclerAdapter = new MyRecyclerAdapter(getActivity(), mValueList);
                    mRecyclerView.setAdapter(mRecyclerAdapter);
                }
            });
        }
    }).start();
}