1

私がやろうとしていること:

1)x分ごとにユーザーの位置情報を更新します

2)タイマーとTimerTaskを使用して、最新の位置情報を記録するWebサービスを呼び出します

何が起こっていますか:

1)TimerTaskが作成されます

2)ユーザーの電話が休止状態/スリープ状態の場合、Webサービスへの呼び出しは機能しません

3)TimerTaskがキューに保存されているようです

4)ユーザーの電話がウェイクアップすると、キューに入れられたすべてのTimerTasksがすぐに実行され、Webサービスに対して複数の不要な場所の更新が発生します

コードスニペットは次のとおりです。

timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {

    try
    {
        //validate that the device has an active & working connection
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = connMgr.getActiveNetworkInfo();

        //validate the the device network provider is enabled
        if ((eview_locationManagerwifi
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER)) && (activeNetwork != null && activeNetwork.getState() == NetworkInfo.State.CONNECTED))
        {
                UpdateSubscriberLocation(); // call the web service to report location data                                                 
        }
        else
        {
            this.cancel();
        }
    }
    catch (Exception e)
    {


    }

ネットワーク接続とプロバイダーが有効になっているチェックは、どちらも「true」で返されるようです。TimerTaskはキャンセルされず、ユーザーの電話がウェイクアップするまでキューに入れられるだけです。

Webサービスからの応答なしに一定の時間が経過した場合、どうすればTimerTaskをキャンセルできますか?TimerTaskで一種の「setTimeout」メソッドを見つけることができませんでした。

4

2 に答える 2

0

TimerTaskを使用せず、Lo​​cationManager.requestLocationUpdates()を使用してください。これはTimerTaskのように合計されることはなく、コードをかなり単純化します。また、ユーザーの場所が変更されない場合は、作業を回避できるという追加のメリットもあります。

于 2012-03-07T20:55:36.273 に答える
0

高速更新が必要な場合は、WakeLockを使用して、デバイスがCPUをシャットダウンしないようにします。詳細については、こちらをご覧ください: http: //developer.android.com/reference/android/os/PowerManager.html

高速更新が必要ない場合(たとえば、1分おきにAlarmManagerを使用します。アラームが発生した場合は、場所の更新をリクエストし、データを送信して次のアラームを設定します:http: //developer.android.com/reference/android/ app / AlarmManager.html

于 2012-03-08T08:28:41.790 に答える