Java Android GPS回调脱离UI线程

Java Android GPS回调脱离UI线程,java,android,multithreading,user-interface,gps,Java,Android,Multithreading,User Interface,Gps,我无法将GPS的Onlocation更改为在不同的线程上运行。我知道在调用函数时如何管理UI线程,但使用GPS时,我不会主动调用函数 我的目的是每次GPS接收到读数时都有一个闪光。我已将此函数置于可运行状态。我将此函数传递给实现LocationListener的类。然后在main类中,我启动了一个调用requestLocationUpdates的新线程。我希望LocationListener的onLocationChanged可以在不同的线程中运行,发布到回调,并在UI线程中产生必要的UI效果。

我无法将GPS的Onlocation更改为在不同的线程上运行。我知道在调用函数时如何管理UI线程,但使用GPS时,我不会主动调用函数

我的目的是每次GPS接收到读数时都有一个闪光。我已将此函数置于可运行状态。我将此函数传递给实现LocationListener的类。然后在main类中,我启动了一个调用requestLocationUpdates的新线程。我希望LocationListener的onLocationChanged可以在不同的线程中运行,发布到回调,并在UI线程中产生必要的UI效果。不幸的是,程序每次尝试调用RequestLocationUpdate时都会崩溃。正确的做法是什么

现在看起来像这样

主要类别:

final Runnable changeLight = new Runnable(){
        public void run(){
            // do stuff
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.capture);

        status = (ImageView) findViewById(R.id.status);
        database = new DatabaseManager(this);

        new Thread(){
            public void run(){
                location = (LocationManager) getSystemService(LOCATION_SERVICE);
                listener = new GPSManager(database, changeLight, light, status);
                location.requestLocationUpdates("gps", 10000L, 0, listener);
            }
        }.start();
    }
LocationListener类:

public void onLocationChanged(Location location) {
        if (location.getAccuracy() <= 32.0){
            light = lightColors.Green;
            status.post(callback);
            database.insertData(location);
        }
        else{
            light = lightColors.Yellow;
            status.post(callback);
        }
    }
public void onLocation已更改(位置){

如果(location.getAccuracy()您的问题可能是由于主线程的不正确同步引起的吗?在应用程序崩溃之前您是否遇到任何异常?您是否可以发布一个符合sscce.org的示例


通常,在GUI上处理异步事件时,应该进行适当的同步:

调用location.RequestLocationUpdate的线程必须有一个循环器(请参阅)。
您可以使用HandlerThread而不是Thread。

我遇到了相同的问题。解决方案是,您希望从位置管理器接收位置更新的新线程必须是一个活套线程。为此,您只需在线程的run()函数中添加以下行

Looper.prepare()

loop.loop()