Android 安卓:如何确保AlarmManager不会崩溃首先AlarmManager是天堂';我不能完成执行吗?
我有一个AlarmManager,它将Android 安卓:如何确保AlarmManager不会崩溃首先AlarmManager是天堂';我不能完成执行吗?,android,Android,我有一个AlarmManager,它将PostSync()每10分钟一次,其中PostSync是将数据同步到服务器的功能 例如: 10分钟后,AlarmManager唤醒,并检查是否存在网络连接。如果没有连接,它将在60秒后再次检查 因此,每当它在10分钟内没有internet连接时,第一个AlarmManager的任务就没有完成,因为它正在等待internet连接。第二个AlarmManager唤醒并检查它是否有Internet(如果没有);它会休眠一分钟,等等。所以,这是无穷大的圆圈……这会
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连接:
- 在这种情况下,请完成您的工作,并使用
设置下一个警报,延迟10分钟AlarmManager#set
- 否则,使用
设置下一个报警,并延迟60秒AlarmManager#set
我认为当前由报警任务启动线程的方法是不可靠的,如果您使用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);