レルムデータベースに格納されているデータに問題があります。 MainActivityの値を変更した場合、NotificationListenerServiceからその値を読み取ろうとすると、データが正しくありません。アクティビティ - サービスレルムとの一貫性のないデータ
これは私のモデルである:
public class Model extends RealmObject {
String name;
boolean checked;
public Model() {}
public Model(String name, boolean checked) {
this.name = name;
this.checked = checked;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
私はApplicationクラスからデータベースを作成:
public class ExampleApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(getApplicationContext()).deleteRealmIfMigrationNeeded().build();
Realm.setDefaultConfiguration(realmConfiguration);
Realm.getDefaultInstance().beginTransaction();
Realm.getDefaultInstance().copyToRealm(new Model("Test1", true));
Realm.getDefaultInstance().copyToRealm(new Model("Test2", true));
Realm.getDefaultInstance().commitTransaction();
}
}
私はとの活性を有する:
- へのリンクボタンをデバイス設定の通知リスナーサービス
- textvie
public class MainActivity extends AppCompatActivity { Button btnEnableService; Button btnChangeValue; TextView tvStatus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnEnableService = (Button) findViewById(R.id.btn_enable_service); btnChangeValue = (Button) findViewById(R.id.btn_change_value); tvStatus = (TextView) findViewById(R.id.tv_status); btnEnableService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { startActivity(new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)); }catch(ActivityNotFoundException anfe){ Toast.makeText(MainActivity.this, "Your device not supports Notification Listener Service", Toast.LENGTH_SHORT).show(); } } }); btnChangeValue.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean status = Realm.getDefaultInstance().where(Model.class).equalTo("name", "Test1").findFirst().isChecked(); Realm.getDefaultInstance().beginTransaction(); Realm.getDefaultInstance().where(Model.class).equalTo("name", "Test1").findFirst().setChecked(!status); Realm.getDefaultInstance().commitTransaction(); updateView(); } }); } @Override protected void onResume() { super.onResume(); updateView(); } private void updateView(){ boolean status = Realm.getDefaultInstance().where(Model.class).equalTo("name", "Test1").findFirst().isChecked(); tvStatus.setText("Status: " + status); } }
私はbtnChangeValueをクリックすると:そのwのモデルの状態(チェックの有無)
- モデルの確認値を変更するボタン
これはコードであることを示していますボタンを押すと、レルムの値が変更され、テキストビューが新しい値で更新されます。今はすべてOK。
一方、私はデバイス通知を聞くサービスを持っています。それは非常に単純だとだけLogCat上のモデルのステータス値を示しています
public class CustomNotificationListenerService extends NotificationListenerService{
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
super.onNotificationPosted(sbn);
boolean status = Realm.getDefaultInstance().where(Model.class).equalTo("name", "Test1").findFirst().isChecked();
Log.i("XXX", "Status: " + status);
}
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
super.onNotificationRemoved(sbn);
}
}
私の問題は、モデルの確認値が矛盾しているということです、私はMainActivityとNotificationListenerServiceから別の値を取得します。
何が間違っているのですか?
ありがとうございます!
これは、あなたは、あなたが呼び出したいすべてのメソッドのためのgetInstanceをCAL一度それを呼び出す、それを変数に割り当て、のgetInstanceへのすべての呼び出しは()マッチングを持たなければならない –
ことを使用することになっていない、巨大なメモリリークが発生しています閉じる() –
はい、私のコードは非常に単純なケースを表し、私は可能な限り明確に投稿しようとしました。 あなたが言ったように、インスタンスを取得し、それを変数に保存し、使用し、**閉じる**の方法がベストプラクティスです。 インスタンスを取得する前に、各呼び出しでデフォルトの設定を再度設定しなければなりませんでした。そうしないと、データが矛盾していたからです。 投稿を編集します。 –