2016-05-24 3 views
1

レルムデータベースに格納されているデータに問題があります。 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から別の値を取得します。

何が間違っているのですか?

ありがとうございます!

答えて

0

数時間のテストの後、私はという問題をすべての操作後にRealmインスタンスを閉じることで解決しました。

したがって、データは一貫しており、NotificationListenerServiceおよびMainActivityからクエリできます。

ExampleApplicationが

public class ExampleApplication extends Application{ 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(getApplicationContext()).deleteRealmIfMigrationNeeded().build(); 
     Realm.setDefaultConfiguration(realmConfiguration); 
     Realm mRealm = Realm.getDefaultInstance(); 
     mRealm.beginTransaction(); 
     mRealm.copyToRealm(new Model("Test1", true)); 
     mRealm.copyToRealm(new Model("Test2", true)); 
     mRealm.commitTransaction(); 
     mRealm.close(); 
    } 
} 

MainActivity

... 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    btnChangeValue.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Realm mRealm = Realm.getDefaultInstance(); 
      boolean status = mRealm.where(Model.class).equalTo("name", "Test1").findFirst().isChecked(); 
      mRealm.beginTransaction(); 
      mRealm.where(Model.class).equalTo("name", "Test1").findFirst().setChecked(!status); 
      mRealm.commitTransaction(); 
      mRealm.close(); 
      updateView(); 
     } 
    }); 
} 
... 

CustomNotificationListenerService

... 
@Override 
public void onNotificationPosted(StatusBarNotification sbn) { 
    super.onNotificationPosted(sbn); 
    Realm mRealm = Realm.getDefaultInstance(); 
    boolean status = mRealm.where(Model.class).equalTo("name", "Test1").findFirst().isChecked(); 
    mRealm.close(); 
    Log.i("XXX", "Status: " + status); 
} 
... 

それがあなたを助けてくれることを願っています。

+1

これは、あなたは、あなたが呼び出したいすべてのメソッドのためのgetInstanceをCAL一度それを呼び出す、それを変数に割り当て、のgetInstanceへのすべての呼び出しは()マッチングを持たなければならない –

+1

ことを使用することになっていない、巨大なメモリリークが発生しています閉じる() –

+0

はい、私のコードは非常に単純なケースを表し、私は可能な限り明確に投稿しようとしました。 あなたが言ったように、インスタンスを取得し、それを変数に保存し、使用し、**閉じる**の方法がベストプラクティスです。 インスタンスを取得する前に、各呼び出しでデフォルトの設定を再度設定しなければなりませんでした。そうしないと、データが矛盾していたからです。 投稿を編集します。 –

関連する問題