服务中的 Android 计时器

标签 android

我在创建的服务中运行计时器时遇到问题。计时器调用的任务根本不会被调用。我知道该服务在我将 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() 
        {
            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 事件,例如 Toast。运行被调用,但 Toast 被忽略。

要在 UI 线程上创建 Toast,您可以使用 Handler 和空 Message,如下所示:

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

关于服务中的 Android 计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3819676/

相关文章:

android - google-map sdk map 设置 - 授权失败,确保以下内容与 API 控制台中的内容相对应

java - 选择可搜索微调器中的项目时应用程序崩溃

android - 在实践中协商 Android 和 iOS 中央/外设上的蓝牙 LE ATT MTU

java - 使用子对象解析 json 数组

android - 如何使用 ffmpeg 使用 pts gmtime 绘制文本冒号?

java - 观察 for 循环内的实时数据

java - Android 中的位图和 OpenCV 中的 Mat

android - 如何使用 Loader 更新单个 TextView

android - 程序类型已经存在 : com. google.android.gms.internal.measurement.zzfe

java - ANDROID:错误 W/DynamiteModule:找不到 com.google.android.gms.googlecertificates 的本地模块描述符类