1

Ich benutze Realm als ORM, um Datenbank in einer Android-Anwendung zu verwalten, alles ist in Ordnung mit diesem. Aber wenn ich eine Push-Benachrichtigung abfange und dann versuche, Benachrichtigungsdaten mit Realm zu speichern, tritt ein Fehler auf. die folgende ist der Fehler:Android - Wie Realm in FirebaseMessagingService-Klasse (keine Aktivität) verwendet wird

java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created. 

Das ist meine Klasse, die von FirebaseMessagingService erweitert:

public class SMovilFirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService { 
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    super.onMessageReceived(remoteMessage); 

    if (remoteMessage.getNotification() != null) 
    { 
     saveDataNotification(remoteMessage.getData().get("resourceId"), remoteMessage.getNotification().getTitle()); 
     showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); 
    } 
} 

private void showNotification(String title, String body) { 
    Intent intent = new Intent(this, Home.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 

    Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_launcher) 
      .setContentTitle(title) 
      .setContentText(body) 
      .setAutoCancel(true) 
      .setSound(soundUri) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(0, notificationBuilder.build()); 
} 

private void saveDataNotification(String resourceId, String message){ 
    Realm realm = Realm.getDefaultInstance(); 

    realm.beginTransaction(); 
    Notifications notification = realm.createObject(Notifications.class, setUniqueId(realm)); 
    notification.setMessage(message); 
    notification.set_state("1"); 
    notification.set_linkResource(resourceId); 
    realm.commitTransaction(); 
} 

}

Dies ist die Klasse, wo ich Realm init, diese Klasse reicht von Anwendungen und BaseApplication ist der Name meiner Anwendung:

}

Dies ist der Ort meiner Dateien in das Projekt:

enter image description here

Ich brauche Realm zu verwenden, um die empfangenen Informationen in der Datenbank zu speichern, aber dieser Fehler erscheint in dieser nicht Aktivitätsdatei.

Hoffe, du kannst mir helfen. Grüße.

+0

Sie müssen eine separate Realm-Instanz für verschiedene Thread erhalten. Siehe https://realm.io/docs/java/latest/#threading – beeender

+1

Ein Stack-Trace wäre nett, und auch Code für 'setUniqueId()' – EpicPandaForce

+0

Code auch von der Aktivität, wo Sie auf Realm zugreifen, bitte. –

Antwort

0

Wenn Sie eine Push-Benachrichtigung erhalten, aktiviert das Android-Betriebssystem Ihren FirebaseMessagingService, unabhängig davon, ob die Aktivität/Anwendung geöffnet ist oder nicht. Das bedeutet, dass Sie nicht nur in einem anderen Thread sind, sondern dass Sie sich in einem anderen Prozess befinden.

Sie müssen also die Daten über einen Intent an den Aktivitäts-/Anwendungsprozess senden. Normalerweise, und wie es für Sie der Fall ist, geschieht dies am besten, indem Sie die gesamte RemoteMessage als Extra in einer Absicht senden, ähnlich wie Sie es bereits mit dem PendingIntent für die Benachrichtigung getan haben.

Dann müssen Sie die eingehende Absicht in Ihrer (Home) -Aktivität behandeln.

Verwandte Themen