Java &引用;无法访问主线程上的数据库";异步任务中的异常
我用LiveData构建了一个简单的房间示例,但是得到了一个 无法访问主线程上的数据库”-IllegalStateException 我的通用体系结构是带有片段的活动,它有一个带有房间的ViewModel&Repository 我的调用从这里开始(我切下片段,点击一个按钮调用该方法) 我使用androidannotations,但这与错误无关 在我看来,这是直截了当的,插入调用显然是在异步任务中,所以这就是为什么我对异常感到困惑的原因 我的ViewModel:Java &引用;无法访问主线程上的数据库";异步任务中的异常,java,android,android-room,android-livedata,Java,Android,Android Room,Android Livedata,我用LiveData构建了一个简单的房间示例,但是得到了一个 无法访问主线程上的数据库”-IllegalStateException 我的通用体系结构是带有片段的活动,它有一个带有房间的ViewModel&Repository 我的调用从这里开始(我切下片段,点击一个按钮调用该方法) 我使用androidannotations,但这与错误无关 在我看来,这是直截了当的,插入调用显然是在异步任务中,所以这就是为什么我对异常感到困惑的原因 我的ViewModel: class FragmentAdd
class FragmentAddKeywordsViewModel extends AndroidViewModel {
KeywordsRepository repository;
public FragmentAddKeywordsViewModel(@NonNull Application application) {
super(application);
if (repository == null) {
repository = new KeywordRepository(application);
}
}
public void addKeyword(Keyword keyword) {
repository.addKeyword(keyword);
}
}
这是我的存储库:
public class KeywordsRepository {
private KeywordDao keywordDao;
public KeywordsRepository (Application application) {
KeywordDatabase db = KeywordDatabase.getDatabase(application);
keywordDao= db.keywordDao();
}
public void addKeyword(Keyword keyword) {
new insertAsyncTask(keywordDao).doInBackground(keyword);
}
private static class insertAsyncTask extends AsyncTask<Keyword, Void, Void> {
private KeywordDao mAsyncTaskDao;
insertAsyncTask(KeywordDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(final Keyword... params) {
mAsyncTaskDao.insert(params[0]); // This line throws the exception
Log.d(getClass().getSimpleName(), "do in background 1");
return null;
}
}
}
最后但并非最不重要的是我的刀
@Dao
interface KeywordDao {
@Query("SELECT * FROM keywords")
LiveData<List<Keyword>> getAllKeywords();
@Insert
void insert(Keyword keyword);
@Delete
void delete(Keyword keyword);
@Query("DELETE FROM keywords")
void deleteAll();
}
@Dao
接口关键字DAO{
@查询(“从关键字中选择*)
LiveData getAllKeywords();
@插入
无效插入(关键字);
@删除
作废删除(关键字);
@查询(“从关键字中删除”)
void deleteAll();
}
这就是我的错误堆栈的结尾:
java.lang.IllegalStateException:无法访问主服务器上的数据库
线程,因为它可能会长时间锁定UI。
在
android.arch.persistence.room.RoomDatabase.assertNotMainThread(RoomDatabase.java:164)
在
android.arch.persistence.room.RoomDatabase.beginTransaction(RoomDatabase.java:211)
在
org.name.project.package.KeywordDao_Impl.insert(KeywordDao_Impl.java:81)
在
org.name.project.package.KeywordsRepository$insertAsyncTask.doInBackground(KeywordsRepository.java:42)
您需要调用
execute
,让asychtask的doInBackground
方法在后台运行
new insertAsyncTask(keywordDao).execute(keyword);
除此之外
new insertAsyncTask(keywordDao).doInBackground(keyword);
您只是在调用类实例的方法
类似的例子是java中的
Thread
,其中threadInstance.start()
创建一个线程而不是threadInstance.run()
您需要调用execute
,让asychtask的doInBackground
方法在后台运行
new insertAsyncTask(keywordDao).execute(keyword);
除此之外
new insertAsyncTask(keywordDao).doInBackground(keyword);
您只是在调用类实例的方法
类似的例子是java中的Thread
,其中threadInstance.start()
创建的线程不是threadInstance.run()
更改
public void addKeyword(Keyword keyword) {
new insertAsyncTask(keywordDao).doInBackground(keyword);
}
到
execute
将在后台线程中调用doInBackground
。更改
public void addKeyword(Keyword keyword) {
new insertAsyncTask(keywordDao).doInBackground(keyword);
}
到
execute
将在后台线程中调用doInBackground
。您正在从UI线程调用doInBackground
。请改用AsyncTask
的execute
方法。同样正确,第一个答案,但只有一条注释:/您正在从UI线程调用doInBackground
。使用>改为执行AsyncTask
方法。同样正确,第一个答案,但只有一条注释:/right,谢谢!但我只能选择一个答案作为正确答案,pavneet singh更快,所以…对,谢谢!但我只能选择一个答案作为正确答案,pavneet singh更快,所以…对,谢谢!格式化cod需要更长的时间我很高兴我们能帮你,尽管你很快就会习惯它,保持它并愉快地编码。对,谢谢!当你发现错误时,在这里格式化stackoverflow的代码花费了更长的时间。我很高兴我们能帮你,尽管你很快就会习惯它,保持它并愉快地编码编码。