位置管理器 - requestLocationUpdates崩溃

时间:2015-06-17 11:33:39

标签: android multithreading gps geolocation

我正在尝试使用以下代码获取当前用户位置 - 城市:

private String getCurrentLocation() {

        LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        LocationListener locListener = new MyLocationListener();
try {
            gps_enabled = locManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }
        try {
            network_enabled = locManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
        }

   if(!gps_enabled){
      // Show alert dialog
    }

   if (gps_enabled) {
            locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    1000, 1, locListener,Looper.getMainLooper());
        }

        if (gps_enabled) {
            location = locManager
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        }

        if (network_enabled && location == null) {
            locManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, 1000, 1, locListener,Looper.getMainLooper());
        }

        if (network_enabled && location == null) {
            location = locManager
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        }

  Fetch city code...
...

}

由于这需要一点时间来加载我使用异步任务在活动启动时显示加载程序。

private class GetLocationTask extends AsyncTask<String, Integer, String>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showProgress();
        }

        @Override
        protected String doInBackground(String... params) {
            return getCurrentLocation();
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            onFinshGetLocationTask(result);
        }
    }

它崩溃了,所以当我们requestLocationUpdates

时我使用了looper
locManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, 1000, 1, locListener,Looper.getMainLooper());

但仍然app崩溃说“每个线程只能创建一个Looper”

我已经研究了很多线程,但仍然无法解决它。

1 个答案:

答案 0 :(得分:0)

因为你不需要在Asynctask中这样做。只需调用它而不使用线程。它将创建自己的线程。

尝试使用它而不使用looper。

使用此方法

requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)

并调用getCurrentLocation();不使用asynctask。

在Asynctask的doInBackGround中

@Override
        protected Object doInBackground(Object[] params) {
         Looper.prepare();
         //do your task
         Looper.myLooper().quit();

            return null;
        }