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
。我假设即使函数先结束,这个线程(可能)也会保持运行,对吗?有没有办法强迫它在结束函数之前等待线程完成?或者这可能违背了目的