2016-09-26 9 views
0

java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не называется Looper.prepare()Android Исключение в перспективе метода в MainTask

Я получил услугу, призывающую к run метод мой MainTask каждые 15 секунд (по причинам тестирования) timer.scheduleAtFixedRate(new MainTask(), 0, 15000); (названный в onStartCommand

код в методе запуска выглядит так:.

public void run() { 
     Log.v("MainTask", "run() Called"); 
     GpsHelper gpsHelper = new GpsHelper(getApplicationContext(), this); // This is causing the error - commented out => no error 
     // Doing some independent webrequests here! 
     } 

Класс GpsHelper выглядит так (он имеет некоторые если заявления - потому что он также используется вне службы в Mainactivity:

public GpsHelper(Context context, LocationReceiver locationReceiver) { 
    this.context = context; 
    this.locationReceiver = locationReceiver; 
    mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    if (locationReceiver instanceof Runnable) { 
     isRunnable = true; 
    } 
    run(); 
} 

/** 
* Getting the Location, handling permission, requesting location updates if time is greater than 2 minutes 
*/ 
public void getLocation() { 
    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && !isRunnable) { 
     StaticHelpers.askForFineLocationPermission(context); 
    } else { 
     if (isRunnable && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      Log.v("GpsHelper", "Runnable can't get position - check permissions!"); 
     } else { 
      Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      // If time not greater than 2 minutes 
      // TODO: Move to resources 
      if (location != null && location.getTime() > Calendar.getInstance().getTimeInMillis() - 2 * 60 * 1000) { 
       Log.v("GpsHelper", "Using existing location"); 
       locationReceiver.onLocationAvailable(location); 
      } else { 
       Log.v("GpsHelper", "No Position Available => Requesting Location Updates"); 
       mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
       if (!isRunnable && !mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
        showSettingsDialog(); 
       } 
      } 
     } 

    } 

После получения позиции этот метод называется: mLocationManager.removeUpdates(this);

Когда возникает эта ошибка? Четвертый раз подряд набирается так называемый

В чем состоит возможный ответ? Ответ должен помочь мне исправить эту ошибку, не изменяя логического поведения, и не должен запускаться на нитке ui!

+0

Log.v («MainTask», «run() Called»); GpsHelper gpsHelper = новый GpsHelper (getApplicationContext(), this); Добавьте этот код внутри обработчика или runOnUiThread() – Kamal

ответ

0
getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Log.v("MainTask", "run() Called"); 
      GpsHelper gpsHelper = new GpsHelper(getApplicationContext(), this); // This is causing the error - commented out => no error 
     } 
    }); 
+0

Я не хочу запускать это в потоке ui, и я не могу назвать 'getActivity' –

+0

, вы не можете обновлять пользовательский интерфейс из другого потока. Создайте обработчик или runOnUiThread. – Kamal

+0

getActivity() доступен во фрагменте. вы можете заменить getActivity на контекст активности. – Kamal