2012-05-09 3 views
0

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

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) 
     { 
     } 
    } 

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

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

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) 
+0

В чем это исключение? – Tim

+0

Я разместил logcat, спасибо – progdoc

+0

попробуйте добавить super.onPostExecute (результат); in onPostExecute –

ответ

4

Вы не можете этого сделать. Нить умирает, как только возвращается doInBackground(). Приемник GPS - это обработчик, для которого требуется поток Looper. В начале doInBackground() вам необходимо позвонить по номеру Looper.prepare(), затем в конце вызова Looper.loop(). Он будет зависеть навсегда, пока вы не назовете quit() на объект Looper потока.

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

Java Can't create handler inside thread that has not called Looper.prepare()

1

как и многие другие вещи, GPS приемник можно слушать только с помощью петельной нити (например, в поток пользовательского интерфейса). проще всего сделать это через поток ui.

также, слушатель gps не назван так без причины. только когда он получит место (и это может занять время), он вызовет метод «onLocationChanged». вам не нужно иметь asyncTask, так как все вызовы «requestLocationUpdates» асинхронны в любом случае ...

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(); 

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

Смежные вопросы