Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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 &引用;无法访问主线程上的数据库";异步任务中的异常_Java_Android_Android Room_Android Livedata - Fatal编程技术网

Java &引用;无法访问主线程上的数据库";异步任务中的异常

Java &引用;无法访问主线程上的数据库";异步任务中的异常,java,android,android-room,android-livedata,Java,Android,Android Room,Android Livedata,我用LiveData构建了一个简单的房间示例,但是得到了一个 无法访问主线程上的数据库”-IllegalStateException 我的通用体系结构是带有片段的活动,它有一个带有房间的ViewModel&Repository 我的调用从这里开始(我切下片段,点击一个按钮调用该方法) 我使用androidannotations,但这与错误无关 在我看来,这是直截了当的,插入调用显然是在异步任务中,所以这就是为什么我对异常感到困惑的原因 我的ViewModel: class FragmentAdd

我用LiveData构建了一个简单的房间示例,但是得到了一个

无法访问主线程上的数据库”-IllegalStateException

我的通用体系结构是带有片段的活动,它有一个带有房间的ViewModel&Repository

我的调用从这里开始(我切下片段,点击一个按钮调用该方法)

我使用androidannotations,但这与错误无关

在我看来,这是直截了当的,插入调用显然是在异步任务中,所以这就是为什么我对异常感到困惑的原因

我的ViewModel:

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的代码花费了更长的时间。我很高兴我们能帮你,尽管你很快就会习惯它,保持它并愉快地编码编码。