【问题标题】:AlarmManager Calling Function in Same ClassAlarmManager 在同一个类中调用函数
【发布时间】:2013-07-02 00:18:24
【问题描述】:

我试图在调用 getLastLocation 之前给 LocationClient 两分钟的时间进行连接。最初我使用 Timer(和 TimerTask)实现了这一点,但由于 Timer 在睡眠模式下无法工作,我想将其转换为 AlarmManager。但是,考虑到 AlarmManager 调用另一个类,我对如何执行此操作有点困惑,而我想留在同一个类中并简单地延迟两分钟。

这是使用计时器的外观。

 Timer theTimer = new Timer();
    theTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            if(checkIfGooglePlay() && checkTime()) {
                getPostLocation();
                stopSelf();
                mLocationClient.disconnect();
            }
        }
    }, TWO_MINUTES);

【问题讨论】:

  • AlarmManager 可以使用pendingIntent调用同一个类
  • 所以我可以调用 mLocationClient.connect(),然后在两分钟后在该类上创建一个带有 AlarmManager 设置的 PendingIntent?
  • 我不知道你的正确要求,但到我理解的程度,你应该使用一个服务类来完成这个。可以使用 AlarmManager 类或以正常方式唤醒,使用接口从您的 Activity 与 Service 进行通信...

标签: android timer location alarmmanager google-play-services


【解决方案1】:

警报管理器通过挂起的意图调用广播接收器。只需将该 BroadcastReceiver 实现作为注册它的类的私有子类即可。这样它就可以完全访问类成员变量和函数。

【讨论】:

  • 嗨@Gabe,我为这个愚蠢的后续问题道歉,但我不知道(并且相信这是不允许的)扩展两个类。如果我没记错的话,您建议的是我编写一个扩展两个类的新子类:public class TheSubClass extends TheFirstClass, BroadcastReceiver
  • 不,我说的是内部类。一个类可以在其中包含第二个类。
  • 嗨@Gabe,我在调用接收器/服务时仍然有些困难。我创建了一个新问题来解决这个问题:stackoverflow.com/questions/17429961/…。感谢您的帮助。
【解决方案2】:

您可以尝试使用 Java 的 Thread.sleep()。这是一个静态方法,因此您不需要实例化一个新的Thread。它会抛出一个InterruptedException,在更简单的情况下,它不应该打扰你。

来自http://developer.android.com/reference/java/lang/Thread.html

使发送此消息的线程在给定的时间间隔内休眠(以毫秒和纳秒为单位)。

【讨论】:

  • 这是一个可怕的想法。如果它在 UI 线程上,它将阻塞线程并导致 UI 变得无响应,可能会触发看门狗计时器。如果它在另一个线程上,它将阻止线程完成它的工作。睡眠在 99% 的情况下都是程序员不知道自己在做什么的迹象。
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多