2

1 秒ごとにバックグラウンドで少しのコードを実行する必要があります。コードは、データベースを検索してアプリケーションに値を返す Web サービスを呼び出します。私の質問は、これを行うにはどの方法が最も効果的でしょうか? Timers、Threads、AsyncTask、および Services について調べましたが、それぞれに長所と短所があるようです。実行時間とバッテリー寿命を考慮して、どちらを使用するのが最適か誰か教えてください。

ありがとう

更新: Aysnc タスクを使用してバックグラウンドでコードを実行し、TimeTask を使用して AsyncTask を定期的にトリガーすることにしました。このようにして、特定のアクティビティを終了すると、操作が破棄されます

4

4 に答える 4

3

このサービスを使用してバックグラウンド操作を実行する必要がありますが、1秒でコードを実行する場合は、1秒ごとに呼び出すハンドラーを使用するサービスの例を次に示します。

public class YourService extends Service {
private static final String TAG = "Your Service";
private final Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {

}
};
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
//  Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");

}

@Override
public void onDestroy() {
    super.onDestroy();
//  Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    handler.removeCallbacks(sendUpdatesToUI);   
}
 private Runnable sendUpdatesToUI = new Runnable() {
        public void run() {
            /// Any thing you want to do put the code here like web service procees it will run in ever 1 second
            handler.postDelayed(this, 1000); // 1 seconds
        }
 };
@Override
public void onStart(Intent intent, int startid) {

    handler.removeCallbacks(sendUpdatesToUI);
    handler.postDelayed(sendUpdatesToUI, 1000);//1 second       
    Log.d(TAG, "onStart");
}

}

また、Androidが3時間または4時間以内にサービスをアイドル状態にするたびにサービスを実行できるわけではありません。フォアグラウンドサービスを使用して、プロセスを長時間実行することをお勧めします。

于 2012-06-11T09:01:09.263 に答える
2

このような操作には、サービス コンポーネントを使用する傾向があります。タスク自体については、(while ループを使用して) 繰り返す前に一定時間待機する AsyncTask を使用します。

于 2012-06-11T08:55:09.310 に答える
0

Thread通話に予想以上の時間がかかった場合に通話がデバイスをロックしないように、新しいものを作成する必要があります。これAsyncTaskはマルチスレッドを使用する簡単な方法ですが、タスクを繰り返す機能がありません。Timerを使用するのが最善だと思いますScheduledExecutorService。を使用することを選択した場合は、それを渡すことができるTimerを作成します。代わりにRunnableを使用しますTimerTaskScheduledExecutorService

スレッドを(サービスは新しいスレッドを提供しません)でラップすることServiceもできますが、これはニーズによっては必ずしも必要ではありません。

コメントで示唆されているように、を使用することもできますHandler.postDelayed()。それでも新しいスレッドを作成してから呼び出す必要がありますが、次のようLooper.prepare()にします。

  class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

( Looperドキュメントのコード)

また; 特にユーザーが低速の接続を使用している場合や、転送する必要のあるデータがある場合は、毎秒Webサービスへの呼び出しが多すぎるように思われるため、呼び出しをできるだけ減らすようにしてください。

于 2012-06-11T08:57:29.200 に答える
0

それは1つの解決策だけではないと思うので、それはあなた次第です。次のrunメソッドを使用してスレッドを開始してみてください。

private final int spleeptime = 1000;
public boolean running;

@Override
public void run() {
    while (running) {
        try {
            int waited = 0;
            while ((waited < spleeptime)) {
                sleep(100);
                waited += 100;
            }
        } catch (InterruptedException e) {
        } finally {
            // your code here
        }
    }
}
于 2012-06-11T08:58:01.417 に答える