Таймер Android внутри сервиса - PullRequest
32 голосов
/ 29 сентября 2010

У меня проблемы с запуском таймера в службе, которую я создал.Задача, которую вызывает таймер, просто не вызывается.Я знаю, что служба начинается, когда я вставляю в нее тосты, и они вызываются, но не тогда, когда они находятся в таймере.Помощь оценена.

класс обслуживания:

public class LocalService extends Service
{
    private static Timer timer = new Timer(); 
    private Context ctx;

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

    public void onCreate() 
    {
          super.onCreate();
          ctx = this; 
          startService();
    }

    private void startService()
    {           
        timer.scheduleAtFixedRate(new mainTask(), 0, 5000);
    }

    private class mainTask extends TimerTask
    { 
        public void run() 
        {
            Toast.makeText(ctx, "test", Toast.LENGTH_SHORT).show();
        }
    }    

    public void onDestroy() 
    {
          super.onDestroy();
          Toast.makeText(this, "Service Stopped ...", Toast.LENGTH_SHORT).show();
    }    
}

Основной класс:

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    startService(new Intent(RingerSchedule.this, LocalService.class));      
}   

Ответы [ 2 ]

52 голосов
/ 29 сентября 2010

Android не допускает события пользовательского интерфейса, такие как тосты, за пределами основного потока.Запуск вызывается, но Toast игнорируется.

Чтобы создать Toast в потоке пользовательского интерфейса, вы можете использовать обработчик и пустое сообщение, например:

public class LocalService extends Service
{
    private static Timer timer = new Timer(); 
    private Context ctx;

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

    public void onCreate() 
    {
          super.onCreate();
          ctx = this; 
          startService();
    }

    private void startService()
    {           
        timer.scheduleAtFixedRate(new mainTask(), 0, 5000);
    }

    private class mainTask extends TimerTask
    { 
        public void run() 
        {
            toastHandler.sendEmptyMessage(0);
        }
    }    

    public void onDestroy() 
    {
          super.onDestroy();
          Toast.makeText(this, "Service Stopped ...", Toast.LENGTH_SHORT).show();
    }

    private final Handler toastHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_SHORT).show();
        }
    };    
}
1 голос
/ 06 августа 2017

Спасибо, мне также нужно было отменить таймер ..

public void onDestroy() {
        timer.cancel();
        Toast.makeText(this, "ServiceTalkGeology stopped.", 
        Toast.LENGTH_SHORT).show();
        super.onDestroy();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...