Android多线程应用程序 - 共享状态

时间:2012-12-21 23:16:45

标签: android multithreading gps

我正在开发具有多个线程的Android应用程序 - 其中一个是从GPS接收器获取每秒1次的数据。我希望其他线程可以访问GPS线程中的信息。

我已经尝试过使用消息队列,但它使代码非常混乱 - 我创建的所有新线程都必须以自己的方式处理消息,所以我必须在每个线程类中做很多新的实现。 / p>

我希望能够以这种方式简单地获取数据:

ApplicationState.getLocation();

所以我可以使用最新的数据。我怎么能完成它?我不想用同步字段创建静态类,因为我不想长时间锁定线程,因为我在其他线程中进行了一些在线图像分析。

这里最好的方法是什么?

干杯, Nebril

2 个答案:

答案 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

触发侦听器