Android 安卓:如何确保AlarmManager不会崩溃首先AlarmManager是天堂';我不能完成执行吗?

Android 安卓:如何确保AlarmManager不会崩溃首先AlarmManager是天堂';我不能完成执行吗?,android,Android,我有一个AlarmManager,它将PostSync()每10分钟一次,其中PostSync是将数据同步到服务器的功能 例如: 10分钟后,AlarmManager唤醒,并检查是否存在网络连接。如果没有连接,它将在60秒后再次检查 因此,每当它在10分钟内没有internet连接时,第一个AlarmManager的任务就没有完成,因为它正在等待internet连接。第二个AlarmManager唤醒并检查它是否有Internet(如果没有);它会休眠一分钟,等等。所以,这是无穷大的圆圈……这会

我有一个AlarmManager,它将
PostSync()
每10分钟一次,其中
PostSync
是将数据同步到服务器的功能

例如:
10分钟后,AlarmManager唤醒,并检查是否存在网络连接。如果没有连接,它将在60秒后再次检查

因此,每当它在10分钟内没有internet连接时,第一个AlarmManager的任务就没有完成,因为它正在等待internet连接。第二个AlarmManager唤醒并检查它是否有Internet(如果没有);它会休眠一分钟,等等。所以,这是无穷大的圆圈……这会发生在这个代码上吗


如何确保如果第一个AlarmManager的任务尚未完成执行,不唤醒第二个AlarmManager?

否则,您可以选择一种更简单的方法 在onreceive方法中,您可以检查网络是否可用

我的意思是,使用广播接收器和报警管理器,您可以调用AlarmManager类的onreceive方法并执行同步操作,对吗? 现在当警报触发第一个任务时检查互联网 1) 如果可用,则执行同步操作并在10分钟后发出警报

如果是---则执行与服务器的同步操作,10分钟睡眠报警=60*10*1000

public class AlarmManagerClass extends BroadcastReceiver 
{    
    public static boolean haveInternet(Context ctx) {

        NetworkInfo info = (NetworkInfo) ((ConnectivityManager) ctx
                .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();

        if (info == null || !info.isConnected()) {
            return false;
        }
        if (info.isRoaming()) {
            // here is the roaming option you can change it if you want to
            // disable internet while roaming, just return false
            return false;
        }
        return true;
    }


     @Override
     public void onReceive(final Context context, Intent intent) 
     {   PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
     wl.acquire();

     // Put here YOUR code.
     Log.d(null,"Alarm !");
     Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

            Thread falador = new Thread() {
                 @Override
                 public void run() {
                     while (haveInternet(context)==false){
                         try {
                            sleep(60000);
                            if (haveInternet(context)==true){
                                PostSync(context);
                                                    return;
                            }
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                     }
                 }
          };
              falador.start
            Log.d(null,"Alarm Exit !");
     wl.release();
     }

 public void SetAlarm(Context context)
 {
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
     Intent i = new Intent(context, AlarmManagerClass.class);
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
 }

}
2) 现在假设没有可用的互联网,然后在1分钟后发出警报

否则--然后不执行与服务器的同步操作并睡眠1分钟60*1*1000

AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent i = new Intent(context, AlarmManagerClass.class);
         PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
         am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); and 
并且只使用一个报警管理器来处理你的东西

我还建议你们,若你们想执行同步操作,那个么就使用后台操作服务,以使执行更加顺畅

建议参考这些

我认为你应该使用
set
而不是
setRepeating
,并且只在第一个任务实际完成后安排下一个任务。这样,您就可以确保永远不会有两个并发AlarmManager,并且,当您有internet连接时,您的任务每10分钟运行一次

我认为这样做会简单得多:使用
AlarmManager#set
,延迟10分钟。在任务中,检查您是否有internet连接:

  • 在这种情况下,请完成您的工作,并使用
    AlarmManager#set
    设置下一个警报,延迟10分钟
  • 否则,使用
    AlarmManager#set
    设置下一个报警,并延迟60秒

我认为当前由报警任务启动线程的方法是不可靠的,如果您使用AlarmManager,请同时使用或延迟10分60秒。

我不明白您的确切意思,u r表示如果网络可用,则休眠警报10分钟,如果没有,则必须取消第一个警报,然后用1分钟重置新警报。正确的?此方法是否持续设置新报警并取消报警,将导致RAM内存不足?您的意思是,您必须将AlarmManager声明为类全局变量,然后根据网络可用与否设置重复时间?对吗?如果你没有互联网连接,我不明白你怎么等60秒:你的
falador
线程从来没有运行过?@Pierre Rust抱歉,有些错误OK,但我仍然认为它不可靠,看我编辑的答案很棒!,应使用
set
而不是
setRepeating
,在任务完成后,仅确定下一次AlarmManager唤醒时间
  AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
     Intent i = new Intent(context, AlarmManagerClass.class);
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60, pi);