Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Sqlite错误:只有创建视图层次结构的原始线程才能接触其视图_Java_Android_Multithreading_Android Recyclerview - Fatal编程技术网

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

Java Sqlite错误:只有创建视图层次结构的原始线程才能接触其视图,java,android,multithreading,android-recyclerview,Java,Android,Multithreading,Android Recyclerview,我试图了解下面错误的原因以及如何修复它 只有创建视图层次结构的原始线程才能接触其 观点 这是我的代码片段 public void refreshMyRecyclerView() { new Thread(new Runnable(){ @Override public void run(){ mValueList = mMyDatabase.fillValueList(); //pulls data from sqlite db

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

只有创建视图层次结构的原始线程才能接触其 观点

这是我的代码片段

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

}

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

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

您可以在后台线程上读取数据库中的值,但应该在UI线程上填充和设置适配器。如果您正在执行
活动
,则可以使用方法
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();
}

答案是否可以更改为正确使用
getActivity().runOnUiThread
?我添加了这个选项。所有提到的方法实际上只是将
Runnable
发布到一个队列,以便在UI线程上运行。对不起,我是说在代码中。将
mRecyclerView.post
替换为
getActivity().runOnUiThread
的正确方法是否正确?其他所有内容都应该相同。也只需要一个
Runnable
。我假设即使函数先结束,这个线程(可能)也会保持运行,对吗?有没有办法强迫它在结束函数之前等待线程完成?或者这可能违背了目的