0

私のアプリでは、ユーザーが位置情報の更新を要求します。これが発生すると、メインアクティビティはロケーションリクエストを開始するサービスを開始します。

私の問題は、サービスが開始された場合、たとえば2分間に3回開始された場合、正しく動作しないことです。

したがって、基本的には、現在の開始が完全に終了するまで開始要求を保留にするサービスが必要です。

サービスが開始されるたびに、サービスが完了するまでに最大10分かかる場合があり、サービスは、渡されたインテントデータに基づいて、各開始リクエストに異なる方法で応答します。

2分間に発生した3つの開始リクエストごとに1つのロケーションリクエストがあることを嬉しく思います(実際には好まれます)が、インテントデータは3つのスタートリクエストのそれぞれとは異なる場合があります。

そこで、IntentServiceを使用してこれを克服し、3つのリクエストすべてを一度に1つずつ処理しようとしましたが、

LocationManager.requestLocationUpdates(...)

は呼び出されません。これは、onHandleIntent(...)がほぼ即座に終了し、基本的にロケーションリクエストに応答する時間を与えていないことが原因である可能性が高いことを理解しています。7分(テストでは3分)後にロケーションリクエストを停止するハンドラーがあります。その後、ロケーション情報が他のメソッドに渡され、UIの更新がユーザーに返されます。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()内でインスタンス化されます。

4

1 に答える 1

0

私は間違いなくそれを考えすぎていました。

私の状況では、すべてのデータを別々に保持する必要があるため、文字列 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 の代わりに Array[String] を使用していましたが、配列のサイズを継続的に拡大できるようにする必要があったため、うまくいきませんでした。これは不可能です。配列のサイズは固定されているため、現在は機能する ArrayList を使用しています。

于 2011-07-05T23:37:30.957 に答える