Проблемы с расположением в Сервисе и IntentService - PullRequest
0 голосов
/ 05 июля 2011

В моем приложении пользователь будет запрашивать обновления местоположения.Когда это происходит, основное действие запускает Службу, которая запускает запрос местоположения.

Моя проблема в том, что если службы запускаются, скажем, 3 раза в течение двух минут, то они не работают должным образом.

Таким образом, в основном мне нужен сервис, чтобы перевести запрос на запуск до полного завершения текущего запуска.

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

Итак, я попытался использовать IntentService, чтобы преодолеть это и обработать все три запроса по одному, но затем

LocationManager.requestLocationUpdates(...)

не вызывается.Я понимаю, что это, вероятно, связано с тем, что onHandleIntent (...) почти сразу же завершает работу и, по сути, не дает времени на запрос местоположения для ответа.У меня есть обработчик, который останавливает запрос местоположения через 7 минут (3 минуты для тестирования), а затем информация о местоположении передается другим методам, которые возвращают обновления пользовательского интерфейса пользователю.Обновления пользовательского интерфейса возвращаются, они просто нулевые, потому что обновления местоположения не выполняются.

Я думаю, что я мог бы использовать onHandleIntent в IntentService, чтобы запустить мой сервис и передать ему данные намерения, но это похоже на действительноплохая практика, и, вероятно, есть лучший способ сделать это. РЕДАКТИРОВАТЬ: Это определенно не будет работать, потому что onHandleIntent в любом случае немедленно запустит мой сервис location, поэтому не будет никакого периода ожидания.

Кроме того, любые тосты, вызываемые в onHandleIntent, вообще не отображаются,хотя все из моего onCreate () работает так, как должно.

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

public class myService extends IntentService {

public findMyDroidService() { 
                super("findMyDroidService"); 
            }

@Override
 protected void onHandleIntent(Intent intent){

        intent.getExtras();
        fromIntentString = intent.getStringExtra("toIntentStringExtra");
        Toast.makeText(this, fromIntentString, Toast.LENGTH_SHORT).show();
        Toast.makeText(this, "Intent Handled", Toast.LENGTH_SHORT).show();
                    locMan.requestLocationUpdates(locListener,...);      
 }
@Override
public void onCreate(){
    super.onCreate();
     locListener = new LocationListener(){
              //code goes here
     }
}
}

Кроме того, мой слушатель местоположения создается в onCreate ();

1 Ответ

0 голосов
/ 06 июля 2011

Я определенно думал об этом.

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

public class myClass extends Service {
      int arrayInt;
      ArrayList<String> arrayStringList;
      int myInt;

      @Override
      public void onCreate() {
            super.onCreate()
      arrayStringList = new ArrayList<String>();
      myInt = 0;
  // additional code not important for this example
      }
@Override
public void onStart(...){
handleCommand(intent);
}
@Override
public void onStartCommand(...){
handleCommand(intent);
return START_STICKY;
}
//I call both onstart and onStartCommand for backwards compatibility
public void handleCommand(Intent intent){
   intent.getExtras();
   arrayStringList.add(intent.getStringExtra("fromIntentString"));
// so I know it worked
   Toast.makeText(this, arrayStringList.get(arrayInt).toString(), 
   Toast.LENGTH_SHORT).show();
//So I can keep track of the size of arrayStringList
   ++arrayInt;
//code for getting the location
useMyData();
}
public void useMyData(){
   // do location getting code
  // Here's where I actually use my array. For this answer, I will just show a toast.
Toast.makeText(getApplicationContext(), arrayStringList.get(myInt).toString(), 
Toast.LENGTH_SHORT).show();
    ++myInt;
    if (myInt < arrayInt) useMyData();
    //I was going to use a for loop, but I couldn't get it to work, and I like this method
    //better 

РЕДАКТИРОВАТЬ: Ранее я использовал Array [String] вместо ArrayList, но это не сработало, потому что я должен был иметь возможность непрерывно увеличивать размер моего массива, который не возможный. Массивы имеют фиксированный размер, поэтому я использовал ArrayList, который теперь работает.

...