我有一个Config类,该类从服务器接收设置。然后,将这些设置应用到名为ApplySettings()的活动方法中。我将这个ApplySettings()函数称为onCreate函数。第一次工作正常,但我无法检测到Activity类中的设置更改。我想在设置更改后立即从Config类调用此ApplySettings()方法。我怎样才能做到这一点?谢谢
Config.Java //Singleton class
public class Config
{
public String name = "";
public void getSettingsFromServer()
{
name = "";//name received from server
}
}
MyActivity.java
public class SettingsSystem extends AppCompatActivity
{
private Config config = Config.getInstance();
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings_system);
ApplySettings();
}
public void ApplySettings()
{
//settings are applied here
}
}
两个类都在单独的文件中。
答案 0 :(得分:1)
您希望将MyActivity
的实例存储在配置类中。
在Config.java
中添加方法:
public class Config
{
public String name = "";
private SettingsSystem activity;
public void getSettingsFromServer()
{
name = "";//name received from server
}
public void setMyActivity(SettingsSystem activity)
{
this.activity = activity;
}
public void applyChanges()
{
if (this.activity != null)
{
this.activity.ApplySettings();
}
}
}
然后在您的MyActivity
类中,您可以执行以下操作:
public void setConfigActivity()
{
this.config.setMyActivity(this);
}
现在,您的配置实例具有SettingsSystem。
注意
方法不应以大写字母开头。这违反了Java编码标准。您还说了它的MyActivity.java
,但将其显示为SettingsSystem
,此处将需要一致性,因为它将无法编译。
具有循环依赖关系也是一种不好的做法。可能想重新考虑一下这两个类如何相互作用。
答案 1 :(得分:1)
您可以使用EventBus来实现所需的目标。
1。创建一个名为SettingsChangedEvent
final public class SettingsChangedEvent { /* Additional fields if needed */ }
2。将以下代码添加到Config类中的getSettingsFromServer()
方法中
public void getSettingsFromServer() {
name = ""; //name received from server
// [ADD THIS] Notify to activity that settings are changed,
// it should apply new settings
EventBus.getDefault().postSticky(new SettingsChangedEvent());
}
3。将这些方法添加到SettingsSystem
活动中
@Override
protected void onStart() {
super.onStart();
// Allow this activity to listen settings changed event
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
// Disallow this activity from listening settings changed event
EventBus.getDefault().unregister(this);
super.onStop();
}
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onSettingsChangedEvent(SettingsChangedEvent ev) {
// When settings changed event is notified/posted from Config class,
// the code inside this method will be executed.
SettingsChangedEvent event = EventBus.getDefault().removeStickyEvent(SettingsChangedEvent.class);
if (event != null) {
// Apply new settings here
ApplySettings();
}
}