2011-07-05 2 views
0

내 앱에서 사용자가 위치 업데이트를 요청합니다. 이 경우 주 활동은 위치 요청을 시작할 서비스를 시작합니다.Service 및 IntentService의 위치 문제

내 문제는 서비스가 시작된 경우 2 분 안에 3 번 말하면 제대로 작동하지 않는다는 것입니다.

기본적으로 현재 시작이 완전히 끝날 때까지 시작 요청을 보류로 설정하는 서비스가 필요합니다.

서비스가 시작될 때마다 서비스가 완료 될 때까지 최대 10 분이 걸릴 수 있으며 서비스는 전달 된 의도 데이터를 기반으로 각 시작 요청에 다르게 응답합니다.

2 분 동안 발생한 세 가지 시작 요청 각각에 대해 하나의 위치 요청이 만족 스럽지만 실제로 의도 한 데이터는 세 가지 시작 요청 각각과 다를 수 있습니다.

그래서,이를 극복하고 세 가지 요청을 한 번에 하나씩 처리 할 수 ​​IntentService를 사용하여 시도,하지만

LocationManager.requestLocationUpdates(...) 

가 호출되지 않습니다. 나는 이것이 onHandleIntent (...)로 인해 거의 즉시 마무리 작업을 수행하고 본질적으로 위치 요청 시간에 응답하지 않기 때문이라고 생각합니다. 7 분 (테스트 3 분) 후에 위치 요청을 중지시키는 처리기가 있으며 사용자에게 UI 업데이트를 반환하는 다른 메서드에 위치 정보가 전달됩니다. UI 업데이트가 반환됩니다. 위치 업데이트가 실패하기 때문에 null입니다.

IntentService에서 onHandleIntent를 사용하여 내 서비스를 시작하고 인 텐트 데이터를 전달할 수 있다고 생각합니다.하지만 실제로는 좋지 않은 것처럼 보입니다. 더 나은 방법이있을 것입니다. 편집 : onHandleIntent가 내 locationService를 즉시 시작하므로 아무런 대기 기간도 없으므로 확실히 작동하지 않습니다.

또한 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() 내에서 인스턴스화됩니다.

+0

내 건배 문제에 대해 http://stackoverflow.com/questions/3955410/create-toast-from-intentservice를 찾았지만 토스트 것은 너무 신경 쓰지 않아서 시도하지 않았습니다. – Jakar

답변

0

나는 그것을 지나치게 overthinking했다.

제 상황에서는 모든 데이터를 별도로 유지해야하므로 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 

: 나는 이전에 배열 [문자열] 대신 ArrayList를 사용하던,하지만 난 계속되지 내 배열의 크기를 확장 할 수 있도록했기 때문에 즉, 작동하지 않았다 가능한. 배열의 크기는 고정되어 있으므로 이제는 ArrayList를 사용했습니다.