0

Я пишу программу, которая набирает пользователей в соответствии с текущей широтой и долготой каждые 5 минут. Я использую AlarmManager и я хочу, чтобы запустить программу фона поэтому я использую IntentService .Но при выполнении программы следующее сообщение об ошибке:Вызвано: java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare()

LogCat

02-06 15:40:03.101: W/dalvikvm(17499): threadid=12: thread exiting with uncaught exception (group=0x4203c2a0) 
02-06 15:40:03.109: E/AndroidRuntime(17499): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.lang.Thread.run(Thread.java:856) 
02-06 15:40:03.109: E/AndroidRuntime(17499): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.os.Handler.<init>(Handler.java:121) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:180) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:180) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:657) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:482) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at com.gpsshoppe.LocationFinder$CurrentLocatioFinder.doInBackground(LocationFinder.java:58) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at com.gpsshoppe.LocationFinder$CurrentLocatioFinder.doInBackground(LocationFinder.java:1) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-06 15:40:03.109: E/AndroidRuntime(17499): ... 5 more 

это мой класс

import android.app.IntentService; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import com.google.android.gms.maps.model.LatLng; 

public class LocationFinder extends IntentService { 
    private Context mcontext; 
    SharedPreferences shprefs; 


    public LocationFinder() { 
     super("LocationFinder"); 
     this.mcontext=this; 

     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     // TODO Auto-generated method stub 
     CurrentLocatioFinder lFinder=new CurrentLocatioFinder(); 
     lFinder.execute(); 

    } 
public class CurrentLocatioFinder extends AsyncTask<String, String, String> implements LocationListener{ 


    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 

     LocationManager locationManager = (LocationManager) mcontext.getSystemService(Context.LOCATION_SERVICE); 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 

     return null; 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 
     if(location!=null){ 
     shprefs=PreferenceManager.getDefaultSharedPreferences(LocationFinder.this); 


     double latitude=location.getLatitude(); 
     Log.i("Inside cLocation", ""+latitude); 

     Editor edit=shprefs.edit(); 
     edit.putString("Ltd", ""+latitude); 
     edit.commit(); 

     double longitude=location.getLongitude(); 

     edit.putString("Lngtd", ""+longitude); 
     edit.commit(); 
     LatLng lng=new LatLng(latitude,longitude); 
     Log.i("LatLng", ""+lng); 

     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 
    } 

} 
+0

Где и инициализирован mcontext? –

ответ

0

Вы определили обработчик обратного вызова для службы местоположения внутри вашей реализации AsyncTask. Обработчики будут выполняться в потоке, где он был создан, поэтому в вашем случае необходимо выполнить обратный вызов местоположения из потока AsyncTask, который он не может выполнить. Я предлагаю вам переместить обработчик locationervice в ваш основной поток. Пусть LocationFinder реализует интерфейс LocationListener.

0

Я просто изменить ваш класс Попробуйте надеюсь, что это работает для вас

public class LocationFinder extends IntentService { 
    private Context mcontext; 
    SharedPreferences shprefs; 

    public LocationFinder() { 
     super("LocationFinder"); 
     this.mcontext = this; 

     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     CurrentLocatioFinder mCurrentLocatioFinder = new CurrentLocatioFinder(); 
     mCurrentLocatioFinder.attach(); 

    } 

    public class CurrentLocatioFinder implements LocationListener { 
     LocationManager locationManager; 

     public void attach() { 
      locationManager = (LocationManager) mcontext.getSystemService(Context.LOCATION_SERVICE); 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
      // TODO Auto-generated method stub 
      if (location != null) { 
       shprefs = PreferenceManager.getDefaultSharedPreferences(LocationFinder.this); 

       double latitude = location.getLatitude(); 
       Log.i("Inside cLocation", "" + latitude); 

       Editor edit = shprefs.edit(); 
       edit.putString("Ltd", "" + latitude); 
       edit.commit(); 

       double longitude = location.getLongitude(); 

       edit.putString("Lngtd", "" + longitude); 
       edit.commit(); 
       LatLng lng = new LatLng(latitude, longitude); 
       Log.i("LatLng", "" + lng); 

      } 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 

     } 
    } 

} 
0

Вы не можете создавать AsyncTask в onHandleIntent, так как его фоновый поток.

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

Однако, если вы действительно хотите Сервис, который заботится об обработке местоположения, то вы можете сделать то же самое с Сервисом, так как его метод onStartCommand работает в основном потоке.

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

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