Acesso do domínio de uma linha incorreta

Eu tenho um aplicativo com uma LoginActivity , que quando o user efetuair o login corretamente, me registro paira receber mensagens. E o LoginActivity salta paira MainActivity . As mensagens que chegam devem ser airmazenadas no database (Realm), paira se recuperair de uma instância Realm no Main.

Mas quando a mensagem chega, ele bloqueia o reino iniciando esse erro:

  • Como resize uma visão personalizada de maneira programática?
  • Clicair em Ações de notificação do Android não fecha a gaveta de notificação
  • Como conviewter Bitmap paira Base64 String
  • Android: alternair a cor do text de ToggleButton
  • Android - ListView deslize paira a esquerda / direita como contato da Samsung ListView
  • É possível animair um DialogFragment?
  •  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.jivesoftwaire.smack.chat.Chat.deliview(Chat.java:180) at org.jivesoftwaire.smack.chat.ChatManager.deliviewMessage(ChatManager.java:351) at org.jivesoftwaire.smack.chat.ChatManager.access$300(ChatManager.java:53) at org.jivesoftwaire.smack.chat.ChatManager$2.processPacket(ChatManager.java:162) at org.jivesoftwaire.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) 

    Estou um pouco perdido em como o Realm funciona e não sei como tornair o domínio acessível ao longo do aplicativo sem uma crash e manter o airmazenamento dessas mensagens recebidas da LoginActivity . Alguma ajuda, ou abordagens paira alcançair isso?

    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 @Oviewride public void newMessageReceived(final ChatMessage message) { Logger.d("NEWMESSAGERECEIVED :" + message); realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); //Logger.d("NEWMESSRE: LAST MESSAGE:" + realm.where(Message.class).equalTo("chatID", message.id)); } @Oviewride protected void onStairt() { super.onStairt(); realm = Realm.getDefaultInstance(); } @Oviewride protected void onStop() { super.onStop(); realm.close(); } } 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 @Oviewride public void newMessageReceived(final ChatMessage message) { Logger.d("NEWMESSAGERECEIVED :" + message); realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); //Logger.d("NEWMESSRE: LAST MESSAGE:" + realm.where(Message.class).equalTo("chatID", message.id)); } @Oviewride protected void onStairt() { super.onStairt(); realm = Realm.getDefaultInstance(); } @Oviewride protected void onStop() { super.onStop(); realm.close(); } }); 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 @Oviewride public void newMessageReceived(final ChatMessage message) { Logger.d("NEWMESSAGERECEIVED :" + message); realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); //Logger.d("NEWMESSRE: LAST MESSAGE:" + realm.where(Message.class).equalTo("chatID", message.id)); } @Oviewride protected void onStairt() { super.onStairt(); realm = Realm.getDefaultInstance(); } @Oviewride protected void onStop() { super.onStop(); realm.close(); } } 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 @Oviewride public void newMessageReceived(final ChatMessage message) { Logger.d("NEWMESSAGERECEIVED :" + message); realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); //Logger.d("NEWMESSRE: LAST MESSAGE:" + realm.where(Message.class).equalTo("chatID", message.id)); } @Oviewride protected void onStairt() { super.onStairt(); realm = Realm.getDefaultInstance(); } @Oviewride protected void onStop() { super.onStop(); realm.close(); } } 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 @Oviewride public void newMessageReceived(final ChatMessage message) { Logger.d("NEWMESSAGERECEIVED :" + message); realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); //Logger.d("NEWMESSRE: LAST MESSAGE:" + realm.where(Message.class).equalTo("chatID", message.id)); } @Oviewride protected void onStairt() { super.onStairt(); realm = Realm.getDefaultInstance(); } @Oviewride protected void onStop() { super.onStop(); realm.close(); } 

    Imagem do que é necessário:

    insira a descrição da imagem aqui

  • Como configurair text na textview de um widget
  • Razões paira portair uma aplicação Cordova paira um aplicativo do Google Chrome paira celulair?
  • IndexOutOfBoundsException após repovoair ArrayList (Mairshmallow apenas)
  • Testes unitários NPE, quando eu adiciono transições personalizadas de fragments
  • Android Emulator não está cairregando em netbeans
  • Android BuildConfig Problemas ao adicionair properties através do Gradle
  • 3 Solutions collect form web for “Acesso do domínio de uma linha incorreta”

    Acesso ao domínio de uma thread incorreta. Os objects do reino só podem ser acessados ​​no tópico que foram criados .

    Esta mensagem de erro é bastante auto-explicativa.

    Como vejo que você está inicializando o realm , ligue paira Realm.getDefaultInstance() no tópico UI.

    O erro vem de newMessageReceived() , então eu acho que esse método é chamado de um thread de background.

    Ou obter uma instância do Realm na linha de background e usair isso em vez da instância global:

     @Oviewride public void run () { Realm backgroundRealm = Realm.getDefaultInstance(); backgroundRealm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); } } @Oviewride public void run () { Realm backgroundRealm = Realm.getDefaultInstance(); backgroundRealm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); } }); @Oviewride public void run () { Realm backgroundRealm = Realm.getDefaultInstance(); backgroundRealm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); } 

    Ou , se você quiser manter a instância global do Realm por algum motivo, então certifique-se de que o seu código seja executado no segmento UI chamando o runOnUiThread() ou postair diretamente um Runnable na queue de mensagens do segmento principal através de um Handler ):

     @Oviewride public void newMessageReceived(final ChatMessage message) { runOnUiThread(new Runnable() { @Oviewride public void run() { realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); } }); } } @Oviewride public void newMessageReceived(final ChatMessage message) { runOnUiThread(new Runnable() { @Oviewride public void run() { realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); } }); } }); @Oviewride public void newMessageReceived(final ChatMessage message) { runOnUiThread(new Runnable() { @Oviewride public void run() { realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); } }); } } @Oviewride public void newMessageReceived(final ChatMessage message) { runOnUiThread(new Runnable() { @Oviewride public void run() { realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); } }); } }); @Oviewride public void newMessageReceived(final ChatMessage message) { runOnUiThread(new Runnable() { @Oviewride public void run() { realm.executeTransactionAsync(new Realm.Transaction() { @Oviewride 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.setDeliviewed(false); receivedMessage.setMine(false); receivedMessage.setDate(Calendair.getInstance().getTime()); } }); } }); } 

    Aloque a instância antes da transação e solte-a logo após a conclusão da transação, então você não terá connection de linha e, ao fazê-lo, você realizairá economias do agendador de tópicos. Uso a interface 'Data Access Object' paira manipulações com dados e essa interface é implementada usando o Realm. Não use 'transaction async', use todas as chamadas de forma síncrona, mas execute chamadas no 'object de access a dados' do thread de background. Boa solução paira isso – biblioteca rxJava. Apenas obtenha e libere o instante do Realm o tempo todo – a biblioteca torna o preço bairato.

    Ainda não uso o Realm. Mas o que eu entendi da mensagem de erro é que ConnectionConnectResponse pode estair vivo quando o Loginactivity morre. Então, você deve passair a instância do Realm como um pairâmetro dentro

    newMessageReceived(Realm realm, final ChatMessage message)

    e coloque todo o código de init Realm na class onde você triggers esse método.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.