我正在使用 Realm 作为 ORM 来管理 Android 应用程序中的数据库,一切都很好。但是,当我捕获到推送通知,然后尝试使用 Realm 保存通知数据时,会发生错误。以下是错误:
java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
这是我从FirebaseMessagingService扩展而来的课程:
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();
}
}
这是我初始化 Realm 的类,这个类是从 Application 扩展而来的,BaseApplication 是我的应用程序的名称:
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder().build();
Realm.setDefaultConfiguration(config);
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
这是我的文件在项目中的位置:
在此处输入图像描述
我需要使用 Realm 将接收到的信息保存在我的数据库中,但是这个错误出现在这个非活动文件中。
希望你能帮助我。问候。
当您收到推送通知时,无论您是否打开了活动/应用程序,Android 操作系统都会启动您的 FirebaseMessagingService。这意味着您不仅在不同的线程中,而且完全处于不同的进程中。
因此,您必须通过意向将数据发送到活动/应用程序进程。通常,就像您的情况一样,最好通过将整个远程消息作为 Intent 中的附加内容发送来完成,类似于您已经对通知的 PendingIntent 所做的操作。
然后,您必须在(家庭(活动中处理传入的意图。