2012-12-21 63 views
2

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

我已经试着用消息队列来做它,但它使代码变得非常混乱 - 我创建的所有新线程都必须以自己的方式处理消息,所以我必须在每个线程类中执行大量新的实现。

我想能够简单地得到这样的数据:

ApplicationState.getLocation(); 

这样我就可以使用最新的数据。我怎样才能做到这一点?我不想用synchronized字段创建静态类,因为我不想锁定线程太久,因为我正在其他线程中进行一些在线图像分析。

这里最好的方法是什么?

干杯, Nebril

+0

你可能想看看你的坐标变量的volatile关键字,因为你似乎只需要'(x,y,z)'这个3'double':[小小的howto](http:// www .javamex.com/tutorials/synchronization_volatile.shtml) – nkr

+0

我想通过一些共享不同变量的通用方式。此外,引用http://en.wikipedia.org/wiki/Volatile_variable#In_Java“(但是,不能保证volatile读写的相对顺序与常规读写相关,这意味着它通常不是有用的线程构造。)“ – Nebril

回答

3

您是否考虑过使用事件总线系统? Otto, an Apache licensed library from Square非常整齐。

您可以创建一个位置更新类,以触发新的LocationUpdateEvents。任何对收到此更新感兴趣的对象都可以使用注释为@Subscribe的方法。对于不依赖杂乱监听器接口的进程间通信来说,这是一种可爱的方法。

Otto的另一个优点是您的LocationUpdater类可以使用@Produce注释方法。有了这个,begins收听LocationUpdateEvents的任何对象都会立即收到一个,其中LocationUpdater找到的最后一个位置。

+0

感谢您在阅读您的答案之前,我和我的同事们决定实施Observer模式,这与Event Bus非常相似,如果我们厌倦了编码,我们会给Otto一个试试:) – Nebril

+1

Otto不适用于进程间通信!!!请参阅https://github.com/square/otto/blob/master/library/src/main/java/com/squareup/otto/Bus.java但在您的情况下(您使用多线程而不是milti-process应用程序)otto将是dev的不错选择。 – gezdy

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)从应用程序中的任何上下文中设置位置(服务,任何活动)在同一过程中(小心有一个过程。你可以有1个过程和Android的多线程):

((MyApp)context.getApplicationContext()).setLastLocation(location); 

3)得到来自任何方面的最新位置在您的应用程序在同一个进程:

((MyApp)context.getApplicationContext()).getLastLocation(); 

注意:您还可以使用听众更好的表现。在MyApp监听器的列表中注册并从onLocationChanged触发监听器

+0

是否可以将上下文传递给应用程序中的每个线程?我的意思是,上下文对象线程安全吗? – Nebril

+1

是应用程序上下文是线程安全的 – gezdy

+1

应用程序上下文已被所有其他人(服务和活动)共享。只有一个进程 – gezdy