Ich habe eine Anwendung mit einem LoginActivity
, dass, wenn der Benutzer richtig anmelden, ich mich registrieren, um Nachrichten zu empfangen. Und die LoginActivity
springt auf MainActivity
. Die ankommenden Nachrichten sollen in der Datenbank (Realm) gespeichert werden, um sich von einer Realm-Instanz in Main zu erholen.Realm-Zugriff von falschem Thread
Aber wenn die Nachricht eintrifft Es Crash Bereich dieses errror Start:
Exception in packet listener
java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
at io.realm.BaseRealm.checkIfValid(BaseRealm.java:383)
at io.realm.Realm.executeTransactionAsync(Realm.java:1324)
at io.realm.Realm.executeTransactionAsync(Realm.java:1276)
at es.in2.in2tant.LoginActivity.newMessageReceived(LoginActivity.java:124)
at es.in2.in2tant.Connection.Connection$4$1.processMessage(Connection.java:227)
at org.jivesoftware.smack.chat.Chat.deliver(Chat.java:180)
at org.jivesoftware.smack.chat.ChatManager.deliverMessage(ChatManager.java:351)
at org.jivesoftware.smack.chat.ChatManager.access$300(ChatManager.java:53)
at org.jivesoftware.smack.chat.ChatManager$2.processPacket(ChatManager.java:162)
at org.jivesoftware.smack.AbstractXMPPConnection$4.run(AbstractXMPPConnection.java:1126)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Ich bin ein wenig verloren, wie Realm funktioniert, und ich weiß nicht, wie Reich ohne eine über die Anwendung zugänglich zu machen Absturz und speichern Sie diese empfangenen Nachrichten von LoginActivity
. Einige Hilfe oder Ansätze, um dies zu erreichen?
LoginActivity.java:
public class LoginActivity extends AppCompatActivity implements ConnectionConnectResponse {
.....
protected void onCreate(Bundle savedInstanceState) {
//Realm Init config:
Realm.init(this);
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder().build();
Realm.deleteRealm(realmConfiguration); // Clean slate
Realm.setDefaultConfiguration(realmConfiguration); // Make this Realm the default
@Override
public void newMessageReceived(final ChatMessage message) {
Logger.d("NEWMESSAGERECEIVED :" + message);
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Message receivedMessage = realm.createObject(Message.class, message.id);
receivedMessage.setBodyMessage(message.message);
receivedMessage.setFrom(message.from);
receivedMessage.setTo(message.to);
receivedMessage.setDelivered(false);
receivedMessage.setMine(false);
receivedMessage.setDate(Calendar.getInstance().getTime());
}
});
//Logger.d("NEWMESSRE: LAST MESSAGE:" + realm.where(Message.class).equalTo("chatID", message.id));
}
@Override
protected void onStart() {
super.onStart();
realm = Realm.getDefaultInstance();
}
@Override
protected void onStop() {
super.onStop();
realm.close();
}
Bild von dem, was benötigt wird:
Es gibt nichts Falsches an der Verwendung der asynchronen Transaktions-API. Und der Typ kennt Realm kaum, warum würdest du ihm auch sagen, dass er mit Rx voll-FRP gehen soll? – EpicPandaForce
Stellen Sie sich vor, Sie müssen eine Transaktion ausführen und nach Abschluss dieser Transaktion eine Schreibtransaktion oder eine Lesetransaktion durchführen. Sie müssen den zweiten Vorgang erst starten, wenn Sie ihn abgeschlossen haben. Wenn Sie async() verwenden, können Sie nicht nachverfolgen, wann die vorherige Transaktion abgeschlossen wurde. Oder wenn Sie ein Objekt in einem Thread erstellen und diese Instanz versehentlich auf einem anderen Thread verwenden (mit Thread-Pool), erhalten Sie einen Fehler. Wenn Sie jedoch die Instanz vor der Transaktion zuweisen und sie nach der Transaktion freigeben, ist dies nicht der Fall –