Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
服务中的Android计时器_Android - Fatal编程技术网

服务中的Android计时器

服务中的Android计时器,android,Android,在我创建的服务中运行计时器时遇到问题。计时器调用的任务没有被调用。我知道,当我在服务中放置祝酒词并调用它们时,服务就会启动,但当它们在计时器内时,服务不会启动。谢谢你的帮助 服务类别: public class LocalService extends Service { private static Timer timer = new Timer(); private Context ctx; public IBinder onBind(Intent arg0)

在我创建的服务中运行计时器时遇到问题。计时器调用的任务没有被调用。我知道,当我在服务中放置祝酒词并调用它们时,服务就会启动,但当它们在计时器内时,服务不会启动。谢谢你的帮助

服务类别:

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));      
}   

Android不允许在主线程之外进行诸如祝酒之类的UI事件。有人在叫跑步,但是祝酒词被忽略了

要在UI线程上创建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();
        }
    };    
}

谢谢,我还需要取消计时器

public void onDestroy() {
        timer.cancel();
        Toast.makeText(this, "ServiceTalkGeology stopped.", 
        Toast.LENGTH_SHORT).show();
        super.onDestroy();
}

我一直在寻找这个答案。你不需要一个带有
WeakReference
的静态
处理程序来防止泄漏吗?非常感谢。如何将整数变量而不是毫秒的5000传递到服务中?我希望能够动态/编程地调整计时器间隔。如何停止计时器?