Вопрос по android, android-asynctask, gps, locationmanager – GPS не работает в Async Task

0

Я реализовал простую программу GPS, которая выбирает координаты и отображает их на экране. Когда я попытался улучшить этот дизайн и реализовать асинхронную задачу, GPS, похоже, не работает по той или иной причине. Есть ли проблема с использованием асинхронной задачи с GPS? Вот мой код:

<code>private class DownloadTask extends AsyncTask<String, Void, Object> {
        protected Object doInBackground(String... args) {
            Log.i("MyApp", "Background thread starting");

            LocationManager mLocationManager;
            Gpslistener Gpslistener;

            Gpslistener = new Gpslistener();

            try{

               mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

               mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,Gpslistener);

            }catch (Exception e) {

                test_gps = true;
           }


        return null;
    }

    protected void onPostExecute(Object result) {

        if(test_gps == true){
            if (ParkingActivity.this.progressDialog != null) {
                ParkingActivity.this.progressDialog.dismiss();
            }               
            AlertMessage("GPS Error", "Unable to get location");
        }



public class Gpslistener implements LocationListener
{
        @Override
        public void onLocationChanged(Location loc)
        {
            loc.getLatitude();
            loc.getLongitude();
        }

        @Override
        public void onProviderDisabled(String provider)
        {       
        }

        @Override
        public void onProviderEnabled(String provider)
        {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras)
        {
        }
    }
</code>

Каждый раз, когда я запускаю его, он всегда ловит исключение. Разрешения GPS установлены в манифесте, и я всегда использую другое приложение, чтобы гарантировать, что соединение GPS подключено к сети, поэтому я устранил их как возможные ошибки. Честно говоря, я не могу думать ни о чем другом, без асинхронной задачи это работает отлично! Любая помощь высоко ценится, спасибо!

Edited Мое исключение logcat:

<code>05-09 22:56:20.199: E/EXCEPTION:(8874): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-09 22:56:20.199: E/EXCEPTION:(8874): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.os.Handler.<init>(Handler.java:121)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:173)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:173)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:579)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:446)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at stefan.testservice.ParkingActivity$DownloadTask.doInBackground(ParkingActivity.java:163)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at stefan.testservice.ParkingActivity$DownloadTask.doInBackground(ParkingActivity.java:1)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.lang.Thread.run(Thread.java:1019)
</code>
Какое исключение это ловит? Tim
я разместил logcat, спасибо progdoc
Это может помочь:stackoverflow.com/q/4187960/1267661 Sam
попробуйте после добавления super.onPostExecute (результат); в onPostExecute ρяσѕρєя K

Ваш Ответ

3   ответа
4

doInBackground() возвращается. Слушатель GPS является обработчиком, который требуетLooper нить, чтобы работать. В началеdoInBackground() тебе нужно позвонитьLooper.prepare() тогда в конце звонкаLooper.loop(), Это будет цикл навсегда, пока вы не позвонитеquit() в темеLooper объект.

AsyncTask хотя он действительно предназначен для одноразовых временных потоков, поэтому я использую для этого обычный поток. Хотя нет причин, по которым вы не могли бы предположить. Вам просто нужно на 100% быть уверенным, что вы закончите цикл, или он будет работать вечно даже после того, как пользователь закроет приложение.

Java не может создать обработчик внутри потока, который не вызвал Looper.prepare ()

0

mLocationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
Looper.prepare();
Looper.loop();
if(mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){    
  mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_MINIMUM_TIME, GPS_MINIMUM_DISTANCE, MyFragment.this);
}
Looper.myLooper().quit();

По сути, он делает текущий поток основным потоком, в котором будут выполняться сообщения, после того как вскоре вы откажетесь от этого потока как основного потока. Я не уверен в последствиях этого.

1

прослушиватель gps может прослушиваться только зацикленным потоком (например, потоком пользовательского интерфейса). самое простое, что можно было бы сделать - это через поток пользовательского интерфейса.

Кроме того, прослушиватель GPS не назван так без какой-либо причины. только когда он получает местоположение (и это может занять время), он вызывает метод & quot; onLocationChanged & quot; , вам не нужно иметь asyncTask для этого, так как все вызовы "requestLocationUpdates" в любом случае асинхронные ...

Похожие вопросы