gpt4 book ai didi

java - 使用自定义事件监听器 java

转载 作者:可可西里 更新时间:2023-11-01 11:42:37 24 4
gpt4 key购买 nike

我正在尝试设置一个从我的 MainActivity 到另一个单例类的自定义事件监听器,但我似乎无法弄清楚我做错了什么。我在我的 mainactivity 中设置了一个 map fragment ,当调用 onLocationChanged() 时,我希望我的数据库类监听这个新位置以将其添加到我的数据库中。这是我到目前为止所拥有的。我只展示与接口(interface)和监听器相关的代码:

主 Activity .java

public List<OnNewLocationRaisedListener> locationListeners;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
locationListeners = new ArrayList<OnNewLocationRaisedListener>();
...
}

@Override
public void onLocationChanged(Location location) {
WeatherDBAccess._context = this;
m_CurrentLocation = location;
WeatherEvent event = new WeatherEvent();

if (record) {
LatLng currLatLng = new LatLng(m_CurrentLocation.getLatitude(), m_CurrentLocation.getLongitude());
for(OnNewLocationRaisedListener listener: locationListeners){
listener.OnNewLocationRaised(event,currLatLng);
}

}
}

public interface OnNewLocationRaisedListener {
void OnNewLocationRaised(WeatherEvent event, LatLng latlon);
}

在我的 WeatherDBAccess.java 类中,我尝试设置它以便我可以将其上下文添加到 mNewLocationListeners 列表中,但它不允许我这样做,我得到一个“无法从静态上下文引用非静态字段” ' 错误,我不知道如何解决:

WeatherDBAccess.java:

public class WeatherDBAccess extends SQLiteAssetHelper
implements MainActivity.OnNewLocationRaisedListener {
public static WeatherDBAccess Instance() {
if(_context == null)
throw new NullPointerException("You must supply the WeatherDBAccess._context prior to calling Instance()");

if(_instance == null)
_instance = new WeatherDBAccess(_context);

return _instance;
}

public WeatherDBAccess(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);

db = this.getWritableDatabase();
Log.d("WeatherDBAccess", "Instance Created " + db.getPath());

MainActivity.locationListeners.add(this); //error

}

@Override
public synchronized void OnNewLocationRaised(WeatherEvent event, LatLng latlon ) {
addTravelData(event); //this method puts the event & latlon into my database

}
}

我可以不在 Activity 中执行此操作吗?

最佳答案

MainActivity.locationListeners 是一个实例成员,不能像您当前在 WeatherDbAccess 中尝试的那样静态访问。

由于 WeatherDBAccess 是单例,您应该做的是在 MainActivity 中将其注册为 locationListener 并取消注册。它应该与您注册和注销 LocationListener 的生命周期回调方法相同。

由于您没有显示该代码,我们假设它在 onResume()onPause() 中,但您可以将添加和删除方法放在它们真正属于的地方.

@Override
public void onResume() {
super.onResume();
locationListeners.add(WeatherDBAccess.Instance());
}

@Override
public void onPause() {
super.onPause();
locationListeners.remove(WeatherDBAccess.Instance());
}

关于java - 使用自定义事件监听器 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35657367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com