Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 活动-服务与域数据不一致_Android_Android Service_Realm - Fatal编程技术网

Android 活动-服务与域数据不一致

Android 活动-服务与域数据不一致,android,android-service,realm,Android,Android Service,Realm,我对域数据库中存储的数据有问题。如果我更改MainActivity上的值,当我尝试从NotificationListenerService读取该值时,数据不正确 这是我的模型: public class Model extends RealmObject { String name; boolean checked; public Model() {} public Model(String name, boolean checked) {

我对域数据库中存储的数据有问题。如果我更改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;
    }

}
我从应用程序类填充数据库:

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();
    }
}
我有一项活动:

  • 带有指向设备设置上的通知侦听器服务的链接的按钮
  • 显示模型状态的文本视图(选中或未选中)
  • 用于更改模型的选中值的按钮
代码如下:

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获得了不同的值

我做错了什么


提前谢谢

在测试了几个小时后,我解决了我的问题在每次操作后关闭领域实例

所以,数据是一致的,我可以从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();
    }
}
main活动

...
@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();
        }
    });
}
...
定制通知ListenerService

...
@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);
}
...

希望它能帮助您。

经过几个小时的测试,我解决了我的问题在每次操作后关闭领域实例

所以,数据是一致的,我可以从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();
    }
}
main活动

...
@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();
        }
    });
}
...
定制通知ListenerService

...
@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);
}
...

希望它能对您有所帮助。

这有一个巨大的内存泄漏,您不应该为每个要调用的方法调用getInstance,调用一次,将其分配给一个变量,并使用它,每次调用getInstance()都必须有一个匹配的close()是的,我的代码表示一个非常简单的情况,我试图尽可能清晰地发布它。正如您所说,最佳做法是获取实例,将其保存在变量上,使用它,然后关闭它。在获取实例之前,我必须在每次调用时再次设置默认配置,因为如果不设置,数据也不一致。我将编辑帖子。设置默认值只需执行一次。如果它不起作用,我知道还有其他错误,但这是所有的代码,如果我不这样做,数据是不一致的…:(这有一个巨大的内存泄漏,您不应该为每个要调用的方法调用getInstance,调用一次,将其分配给一个变量,并使用该选项,对getInstance()的每次调用都必须有一个匹配的close()是的,我的代码代表了一个非常简单的案例,我试图尽可能清晰地发布它。最佳实践是,正如您所说,获取实例,将其保存在变量上,使用它,然后关闭它。在获取实例之前,我必须在每次调用时再次设置默认配置,因为如果没有,数据也不一致。我将编辑发布。设置默认配置t应该只需要做一次。如果它不起作用,我知道还有其他错误,但这里是所有代码,如果我不做这个解决方法,数据是不一致的…:(