2014-10-04 69 views
6

我试图建立一个Android应用程序,它将每隔10分钟反复运行一些程序。 因为我发现Handlers比定时器或调度更可靠。所以我打算使用下面给出的代码使用Handlers开发我的应用程序。重复任务的Android Handler - 它会重叠吗?定时器任务VS处理程序VS闹钟管理器

我有点担心下面的代码会在每次启动应用程序并保持它们并行运行时创建单独的Handlers,可能是因为我在onCreate上创建了Handler

那么最好的办法是保持一次只能在后台运行一个Handler

private Handler handler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler = new Handler(); // new handler 
    handler.postDelayed(runnable, 1000*60*10); // 10 mins int. 
    setContentView(R.layout.activity_pro__sms); 
} 

private Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     /* my set of codes for repeated work */ 
     foobar(); 
     handler.postDelayed(this, 1000*60*10); // reschedule the handler 
    } 
}; 
+0

只是想知道:“重复劳动”的背景是什么?或者更好的说:它是一种什么样的应用程序?这可能是一个非常慷慨的假设,认为用户一次将主动使用您的应用10分钟以上(除非它像游戏或其他,因此我的问题)。当你的应用程序不在前台时使用'Handler',可能无法采取正确的行动。 – 2014-10-04 08:05:54

+0

为什么不使用服务? – 2014-10-04 17:22:31

+0

即使在睡眠模式下运行,我也不需要错过任务。即使在空闲(睡眠)模式下,服务是否可以激活?或者我需要有一个唤醒锁。与AlarmManager相比,服务中的资源使用情况如何(现在我正在尝试使用警报管理器) – 2014-10-04 17:30:43

回答

4

我决定回答我自己的问题,因为我找到了正确的方法。 Android方式。首先,我想要做的事和张贴在问题上是对我的要求的错误方法。现在我发布这个,所以别人不会做错误的方式,但以下方式。

Android有很少的时机选项。

  1. Timer-task - >在应用程序处于活动状态时运行。最适合短期计时。资源使用率更高。

  2. 处理程序 - >在应用程序处于活动状态时运行。但不适合用作调度程序。 (这是我问过的,这不是正确的方法)。 Handlers是反复执行某些操作直到应用程序死亡的最佳方式。

  3. Alarm-manager - >即使应用程序被杀死,安排将来要发生的事情的最佳方式。 (这是我应该申请我的应用程序)。

这就是我想到的。如我错了请纠正我。

+4

这是不正确的。 Handler只是在应用程序线程上安排任务。处理程序任务在应用程序死亡时死亡。 – 2014-10-04 16:38:02

+0

那么调用“postDelayed(Runnable,long)”方法时会发生什么情况。它是否会保持应用程序线程处于活动状态,以便触发可运行的应用程序。 – 2014-10-04 16:44:29

+2

不!延迟的事件根本不会发生。 – 2014-10-04 16:53:38

3

您可以扩展Application类并在其中完成您的工作。

public class App extends Application { 

    private Handler handler; 

    @Override 
    protected void onCreate() { 
     super.onCreate(); 
     handler = new Handler(); // new handler 
     handler.postDelayed(runnable, 1000*60*10); // 10 mins int. 
     setContentView(R.layout.activity_pro__sms); 
    } 

    private Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      /* my set of codes for repeated work */ 
      foobar(); 
      handler.postDelayed(this, 1000*60*10); // reschedule the handler 
     } 
    }; 
} 

而且在清单申报类:

<application android:name=".App"> 

编辑

但是,只有当你的应用程序正在运行,将工作,否则,你可以使用AlarmManager

+0

谢谢。我会试一试,并在几分钟之内回复你。 – 2014-10-04 07:53:30

+0

实际上我想要的是防止创建多个处理程序。 应该有一种方法,在android开发者网站上他们说handler是最合适的方式。 – 2014-10-04 08:10:11

+2

Vang给你的将只创建一个处理程序,并根据时间过去重复该过程。注意他正在扩展Application类,该类只调用一次,即创建应用程序时(启动应用程序时)。如果您完全销毁应用程序,处理程序将停止工作,否则,一次只能运行一个应用程序。如果您正在寻找一个不断运行的处理程序,请使用上述的AlarmManager。 – NightwareSystems 2014-10-04 08:12:18