等待Android Listener完成

时间:2015-05-12 16:27:30

标签: android locking listener semaphore nonblocking

我有一个notifyDataSetChanged函数,我需要在该方法中接收位置更改,并在我收到这些更改后执行另一个方法。 问题是,我必须给android一个locationlistener并让服务找到gps位置,然后调用我的监听器函数。我需要在notifyDataSetChanged中发生所有这些。

我的方法:

@Override
public void onDataSetChanged() {
    Log.i(Constants.LOG_TAG, "entering notifyDataSetChanged()");
    try {
        semaphore.acquire();

        Looper.prepare();
        Log.i(Constants.LOG_TAG, "requesting GPS updates..");
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                Log.i(Constants.LOG_TAG, "got a location: " + location.getLatitude() + ", " + location.getLongitude());
                locationManager.removeUpdates(this);
                loadData(location);

                semaphore.release();
            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

            }
        });
        Looper.loop();

//Wait for loadData to finish after i got the location
        semaphore.acquire();
        semaphore.release();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.i(Constants.LOG_TAG, "exiting notifyDataSetChanged()");
}

然而"退出notifyDataSetChanged()"永远不会......

有什么想法吗?

祝你好运 约翰

1 个答案:

答案 0 :(得分:0)

查看文档here,它说:确保调用quit()来结束循环。 ;)