1

私はRealmをORMとして使用して、Androidアプリケーションでデータベースを管理しています。しかし、プッシュ通知を受け取り、レルムを使用して通知データを保存しようとすると、エラーが発生します。 次のエラーです:これはFirebaseMessagingServiceから延びている私のクラスであるAndroid - FirebaseMessagingServiceクラス(非活動)でRealmを使用する方法

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

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(); 
} 

}

これは私がレルムを初期化クラスで、このクラスは、アプリケーションから延び、 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); 
} 

}

このプロジェクトに私のファイルの場所:

enter image description here

私は私のデータベースで受け取った情報を保存するためにレルムを使用する必要がありますが、このエラーは、この非活動ファイルに表示されます。

あなたが私を助けてくれることを願っています。よろしくです。 よろしくお願いします。

+0

異なるスレッドに対して別々のRealmインスタンスを取得する必要があります。 https://realm.io/docs/java/latest/#threading – beeender

+1

を参照してください。スタックトレースが便利で、 'setUniqueId() 'のコード – EpicPandaForce

+0

また、Realmにアクセスするアクティビティのコードも参考にしてください。 –

答えて

0

プッシュ通知を受信すると、あなたの活動/アプリケーションを開いているかどうかにかかわらず、AndroidオペレーティングシステムはFirebaseMessagingServiceをスピンアップします。これは、あなたが別のスレッドの中にいるだけではなく、別のプロセスの中にいることを意味します。

したがって、データをインテント経由でアクティビティ/アプリケーションプロセスに送信する必要があります。通常、あなたの場合と同様に、これはRemoteMessage全体をインテントのExtraとして送信することで最も効果的です。通知のためにPendingIntentですでに行ったことと同様です。

次に、(ホーム)アクティビティで着信インテントを処理する必要があります。