Ошибка Тема уже запущена / запланирована - PullRequest
0 голосов
/ 04 ноября 2011

Друзья

Я установил AlarmManager в своем приложении. AlarmManager планирует запускать фоновую службу каждые xx, здесь 1 мин. Это работает довольно хорошо на некоторое время. Но часто я получаю ошибку: thead уже запущен / запланирован. У меня такое чувство, что я не могу правильно использовать деструкторы. Был бы признателен за вашу поддержку.

Вот мой код действия, которое запускает AlarmManager

    PendingIntent pi;
    AlarmManager mgr;
    mgr=(AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);

    Intent i=new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class);

     pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0);
         ........  
    if (viewId == R.id.b_startService) {


        mgr.cancel(pi);

        mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1* 60* 1000, pi);}

            ........
    if (viewId == R.id.b_stopService) {


        mgr.cancel(pi);}

и вот важный код моей службы:

                      private Runnable LocationUpdateTimerTask = new Runnable() {
    public void run() {
        Log.i(ctx.getString(R.string.app_name),
                "HUJIDataCollectionService, 1 LocationUpdateTimerTask, start");
        setuplistenerandrequestupdates();
        mHandler.removeCallbacks(LocationUpdateTimerTask);

    }
};


            private Runnable SendDataStopLocationUpdatesTimerTask = new Runnable() {
    public void run() {

        sendDataToServer();



        mHandler.removeCallbacks(SendDataStopLocationUpdatesTimerTask);

        ServiceIntervalTimerTask.cancel();
        Intent service = new Intent(ctx, HUJIDataCollectionService.class);
        stopService(service);

    }
};


            private TimerTask ServiceIntervalTimerTask = new TimerTask() {
    @Override
    public void run() {


        // remove old timer updates
        mHandler.removeCallbacks(LocationUpdateTimerTask);
        mHandler.removeCallbacks(SendDataStopLocationUpdatesTimerTask);
        // Start TimerTasks delayed
        mHandler.postDelayed(LocationUpdateTimerTask, 1000);
        mHandler.postDelayed(SendDataStopLocationUpdatesTimerTask,
                conf_LocationUpdatePeriodInSec * 1000);


    }

};


            @Override
public void onDestroy() {
    super.onDestroy();



    startDataCollectionServiceIntervallTimer.cancel();

    startDataCollectionServiceIntervallTimer = null;
    // Remove all kinds of updates
    mHandler.removeCallbacks(LocationUpdateTimerTask);
    mHandler.removeCallbacks(SendDataStopLocationUpdatesTimerTask);


}


             @Override
public int onStartCommand(Intent intent, int flags, int startId) {



    startDataCollectionServiceIntervallTimer = new Timer(
            "HUJIDataCollectionServiceStartTimer");

    startDataCollectionServiceIntervallTimer.schedule(ServiceIntervalTimerTask,
            1000L, conf_sampleTimeInMin * 60 * 1000L);

    mHandler = new Handler();

    return START_STICKY;
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2011

Я думаю, что нашел решение проблемы самостоятельно.Сначала я обошел проблему, запустив Broadcastreceiver.Но это не ответ на описанную проблему.

Вот решение:

                 public void pause(){           


        while(true){    

            try {                           // goes through this thread until our thread died
                ourthread.join();        //Blocks the current Thread (Thread.currentThread()) until the receiver finishes its execution and dies.
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
            break;
        }

Спасибо за поддержку в любом случае !!!Приветствия

0 голосов
/ 04 ноября 2011

Когда вы запускаете сервис, он запускается в фоновом режиме, даже когда приложение уничтожено.Где и когда вы звоните своему менеджеру по тревоге ???Но если вы часто звоните в службу, я думаю, что у вас будет утечка памяти или что-то в этом роде ...

...