2

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

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

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

ApplicationState.getLocation();

所以我可以使用最新的数据。我怎样才能实现它?我不想创建具有同步字段的静态类,因为我不想锁定线程太久,因为我正在其他线程中进行一些在线图像分析。

这里最好的方法是什么?

干杯,内布里尔

4

2 回答 2

3

您是否考虑过使用事件总线系统?来自 Square 的 Apache 许可库 Otto非常简洁。

您可以创建一个触发 new 的位置更新类LocationUpdateEvents。任何有兴趣接收此更新的对象都可以有一个用 注释的方法@Subscribe。这是进程间通信的好方法,它不依赖于混乱的侦听器接口。

Otto 的另一个优点是您的 LocationUpdater 类可以有一个用@Produce 注释的方法。这样,任何正在begins侦听的对象LocationUpdateEvents都将立即收到一个带有您找到的最后一个位置的对象LocationUpdater

于 2012-12-22T00:30:26.683 回答
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 触发监听器

于 2012-12-21T23:31:00.243 回答