Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.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
使用自定义事件侦听器java_Java_Android - Fatal编程技术网

使用自定义事件侦听器java

使用自定义事件侦听器java,java,android,Java,Android,我试图设置一个自定义事件监听器,从我的MainActivity到另一个singleton类,但我似乎不知道我做错了什么。我在mainactivity中设置了一个映射片段,当调用onLocationChanged()时,我希望我的DB类侦听这个新位置以将其添加到数据库中。这就是我目前所拥有的。我只展示与接口和侦听器相关的代码: MainActivity.java public List<OnNewLocationRaisedListener> locationListeners; p

我试图设置一个自定义事件监听器,从我的MainActivity到另一个singleton类,但我似乎不知道我做错了什么。我在mainactivity中设置了一个映射片段,当调用onLocationChanged()时,我希望我的DB类侦听这个新位置以将其添加到数据库中。这就是我目前所拥有的。我只展示与接口和侦听器相关的代码:

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

我可以不从活动中执行此操作吗?

main活动。locationListeners
是实例成员,不能像您当前在
WeatherDbAccess中尝试的那样静态访问

既然
WeatherDBAccess
是一个单例,那么您应该做的是从
MainActivity
中注册并注销它作为
locationListener
。它应该与注册和注销
LocationListener
的生命周期回调方法相同

由于您没有显示代码,让我们假设它位于
onResume()
onPause()
中,但是您可以将add和remove方法放在它们真正属于的任何位置

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

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

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