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:
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.
Sie müssen eine separate Realm-Instanz für verschiedene Thread erhalten. Siehe https://realm.io/docs/java/latest/#threading – beeender
Ein Stack-Trace wäre nett, und auch Code für 'setUniqueId()' – EpicPandaForce
Code auch von der Aktivität, wo Sie auf Realm zugreifen, bitte. –