我正在开发具有多个线程的Android应用程序 - 其中一个是从GPS接收器获取每秒1次的数据。我希望其他线程可以访问GPS线程中的信息。
我已经尝试过使用消息队列,但它使代码非常混乱 - 我创建的所有新线程都必须以自己的方式处理消息,所以我必须在每个线程类中做很多新的实现。 / p>
我希望能够以这种方式简单地获取数据:
ApplicationState.getLocation();
所以我可以使用最新的数据。我怎么能完成它?我不想用同步字段创建静态类,因为我不想长时间锁定线程,因为我在其他线程中进行了一些在线图像分析。
这里最好的方法是什么?
干杯, Nebril
答案 0 :(得分:3)
您是否考虑过使用Event Bus系统? Otto, an Apache licensed library from Square非常整洁。
您可以创建一个触发新LocationUpdateEvents
的位置更新类。任何对接收此更新感兴趣的对象都可以使用@Subscribe
注释的方法。这是进程间通信的一种很好的方法,它不依赖于凌乱的监听器接口。
Otto的另一个优点是您的LocationUpdater类可以使用@Produce注释方法。有了这个,begins
正在收听LocationUpdateEvents
的任何对象都会立即收到您LocationUpdater
找到的最后一个位置的对象。
答案 1 :(得分:1)
1)创建应用程序类“MyApp”:
清单文件中的1.1):
<application
android:name=".MyApp"
....
/>
1.2)创建类:
public class MyApp extends Application {
public void onCreate() {
super.onCreate();
}
private volatile Location mLastLocation = null;
public Location getLastLocation(){
return mLastLocation;
}
public void setLastLocation(Location mLastLocation){
this.mLastLocation = mLastLocation;
}
}
2)在同一进程中设置应用程序中的任何上下文(服务,任何活动)的位置(小心有一个进程。你可以在android中有1个进程和多线程):
((MyApp)context.getApplicationContext()).setLastLocation(location);
3)在同一过程中从应用程序的任何上下文中获取最新位置:
((MyApp)context.getApplicationContext()).getLastLocation();
注意:您还可以使用侦听器以获得更好的性能。在MyApp侦听器的列表中注册并从onLocationChanged
触发侦听器