部屋で@Deleteアノテーションは何も放出しません。これはDAOは部屋で削除(rxjava)
@Dao
public interface UserDao {
@Delete
void deleteUser(User user);
//We can't use Maybe or Single or anything here
}
userRepository.deleteUser()のような何かをしながら、これはそれ問題になるように見えるものである。subscribeOn当方は一切の発光がDAOを来ていない持っているので。次のコードを使用して、バックグラウンドスレッドでdeleteUserを呼び出します。
Observable.just(appDatabase).
subscribeOn(SchedulerProvider.getInstance().computation()).
subscribe(db -> {
userRepository.logoutUser(loggedUser.getLoggedInUser());
loggedUser.setLoggedInUser(null);
}, this::handleError);
これは問題なく動作します。しかし、subscribeメソッドでは、削除の成功を通知するトーストを表示するためにアンドロイドUIにアクセスする必要があります。 (observeOnがチェーンから欠落しているので)当然のことながら、私はこの
Observable.just(appDatabase).
subscribeOn(SchedulerProvider.getInstance().computation()).
observeOn(SchedulerProvider.getInstance().ui()).
subscribe(db -> {
userRepository.logoutUser(loggedUser.getLoggedInUser());
loggedUser.setLoggedInUser(null);
Message message = new Message(R.string.user_logged_out_msg);
message.setMessageType(Message.MessageType.SUCCESS_MESSAGE);
view.showMessages(Arrays.asList(message)); //this leads to a taost
}, this::handleError);
ようobserveOnを入れたときに、私は妙に
cannot access database on the main thread since it may potentially lock the ui for a long period of time
何この例外を取得しかし
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
この例外を取得します地球上で?
私はあなたのための決定的な答えを持っていませんが、私は、デフォルトではルームが明示的subscibeOn(呼び出す必要はありませんので、そのRXJavaは、バックグラウンドスレッドで呼び出しを行うと言うことができます)しかし、あなたは確認する必要がありますあなたがUIスレッドにアクティビティをプッシュするためにonを観察するよう呼び出すようにしてください。これは私があなたであれば私が見ている領域です。 –
"私はバックグラウンドスレッドでdeleteUserを呼び出すために次のコードを使用します" - あなたは 'deleteUser()'を呼び出していません。一貫性を持たせるために例を同期させたいかもしれません。 – CommonsWare