3

Я начинаю разработку Android и теперь участвую в обучении.
Я создал простой сервис для тост строки непрерывно.
Я взял две кнопки, чтобы начать и остановить сервис.
Когда я нажимаю кнопку «Пуск», запускается служба, и она непрерывно поджаривает строку.
Но когда я иду, чтобы остановить службу, нажав кнопку остановки, она не остановится.
Он будет непрерывно поджаривать струну.Как остановить фоновое обслуживание?

public class MyService extends Service { 

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

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); 

     doToast(); 

     return START_STICKY; 
    } 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); 
    } 


    public void doToast() 
    { 
     final Handler handler= new Handler(); 
     handler.postDelayed(new Runnable(){ 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       Toast.makeText(MyService.this, "hi", 0).show(); 
       handler.postDelayed(this, 3000); 
      } 

     }, 3000); 

    } 

} 

Это код для запуска и остановки службы

startservice.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     startService(new Intent(getBaseContext(), MyService.class)); 
    } 
}); 

stopservice.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     stopService(new Intent(getBaseContext(), MyService.class)); 
    } 
}); 
+0

ваша служба остановится, но ваш обработчик еще называется 'Runnable', так что вы должны удалить обратные вызовы в' OnStop() 'или' OnDestroy() ' –

+0

, как сделать это? –

+0

try async task ... –

ответ

3

Как уже упоминалось MD, даже если вы остановив службу, вы должны удалить обратные вызовы, поскольку работоспособным все еще находится в очереди сообщений, ожидая, чтобы снова отправить сообщение. То есть:

public class AwesomeService extends Service { 
// other stuff 
    private int DELAY = 2000; 
    Handler mHandler = new Handler(); 
    Runnable toastRunnable; 
    public void doToast() { 
    mHandler.postDelayed(getToastRunnable(), DELAY); 
    } 
    private Runnable getToastRunnable() { 
    Runnable r = new Runnable() { 
     @Override public void run() { 
     // show toast 
     // doToast() 
     } 
    }; 
    toastRunnable = r; 
    return r; 
    } 
... 
    // and to remove the callbacks, 
    @Override public void onDestroy() { 
    super.onDestroy(); 
    mHandler.removeCallbacks(toastRunnable); 
    } 
} 
+0

Спасибо. Спас мой день. –

 Смежные вопросы

  • Нет связанных вопросов^_^