Activity - 服务与领域不一致的数据
Activity - Service Inconsistent data with Realm
我对存储在 Realm 数据库中的数据有疑问。如果我更改 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;
}
}
我从应用程序 class:
填充数据库
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();
}
}
我有一个 activity 有:
- 设备设置上带有 link 通知侦听器服务的按钮
- 显示模型状态(选中与否)的文本视图
- 用于更改模型选中值的按钮
这是代码:
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 按钮时,我更改了 Realm 上的值,textview 也更新为新值。目前一切正常。
另一方面,我有一个监听设备通知的服务。很简单,只显示模型在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 得到不同的值。
我做错了什么?
提前致谢!
经过几个小时的测试,我解决了我的问题在每次操作后关闭 Realm 实例。
所以,数据是一致的,我可以从 NotificationListenerService 和 MainActivity 查询。
示例应用程序
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);
}
...
希望对你有帮助。
我对存储在 Realm 数据库中的数据有疑问。如果我更改 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;
}
}
我从应用程序 class:
填充数据库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();
}
}
我有一个 activity 有:
- 设备设置上带有 link 通知侦听器服务的按钮
- 显示模型状态(选中与否)的文本视图
- 用于更改模型选中值的按钮
这是代码:
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 按钮时,我更改了 Realm 上的值,textview 也更新为新值。目前一切正常。
另一方面,我有一个监听设备通知的服务。很简单,只显示模型在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 得到不同的值。
我做错了什么?
提前致谢!
经过几个小时的测试,我解决了我的问题在每次操作后关闭 Realm 实例。
所以,数据是一致的,我可以从 NotificationListenerService 和 MainActivity 查询。
示例应用程序
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);
}
...
希望对你有帮助。