Java 如果没有可用的internet连接,请重新安排AsyncTask以4分钟为间隔运行20分钟
我正在尝试在SmsReceiver广播上执行异步任务。我的代码的问题是,如果SMS广播接收器触发时没有可用的internet连接,则不会执行异步任务。如果没有可用的internet连接,我希望在接下来的20分钟内安排AsyncTask以4分钟的间隔运行5次。若在任何执行异步任务时从服务器获得响应,则取消下一次执行并更新UI。我可以在onPostExecute()中更新UI。我之前问过这个问题,但没有得到任何代码帮助。ScheduledExecutorService上有很多帖子可以安排AsyncTask以x分钟为间隔运行,但我找不到任何帖子可以将AsyncTask以x分钟为间隔运行x分钟。只有安卓官方网站上有a,但我不知道如何操作我的代码来工作。如果有人能帮助我,我将不胜感激 SmsReceiver.javaJava 如果没有可用的internet连接,请重新安排AsyncTask以4分钟为间隔运行20分钟,java,android,android-asynctask,Java,Android,Android Asynctask,我正在尝试在SmsReceiver广播上执行异步任务。我的代码的问题是,如果SMS广播接收器触发时没有可用的internet连接,则不会执行异步任务。如果没有可用的internet连接,我希望在接下来的20分钟内安排AsyncTask以4分钟的间隔运行5次。若在任何执行异步任务时从服务器获得响应,则取消下一次执行并更新UI。我可以在onPostExecute()中更新UI。我之前问过这个问题,但没有得到任何代码帮助。ScheduledExecutorService上有很多帖子可以安排AsyncT
public class SmsReceiver extends BroadcastReceiver {
static boolean flagAlarmSet;
static int count;
public void onReceive(Context context, Intent intent) {
final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
String action = intent.getAction();
if (action.equals(ACTION_SMS_RECEIVED) || action.equals("ActionRetry")) {
Log.d("SmsReceiver Broadcast triggered", "OK");
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
Log.d("Internet is connected", "flagAlarmSet to: " + flagAlarmSet);
//if (flagAlarmSet) { //Removed
count = 0;
flagAlarmSet = false;
CancelAlarm(context);
Log.d("Alarm cancelled", "Alarm");
//} //Removed
//start AsyncTask even if flag was not set, you could have internet the first time in
try {
Log.d("Executing TheTask()", "OK");
new TheTask().execute("http://somedomain.tld/index.php?userId=12345678");
} catch (Exception e) {
Log.d("TheTask Execution Error", "FAIL");
e.printStackTrace();
}
}
if (networkInfo == null) {
if (!flagAlarmSet){
Log.d("Internet is NOT connected.", "Schedule Retry");
flagAlarmSet = true;
SetAlarm(context);
Log.d("Alarm Set", "Alarm");
}
else{
count++;
if (count >= 5){
Log.d("Internet is NOT connected.", "Max Tries Reached, Cancel Alarm");
count = 0;
flagAlarmSet = false;
CancelAlarm(context);
}
}
}
}
}
class TheTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg0) {
String text = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(arg0[0]);
HttpResponse resp = httpclient.execute(httppost);
HttpEntity ent = resp.getEntity();
text = EntityUtils.toString(ent);
} catch (Exception e) {
e.printStackTrace();
}
return text;
}
@Override
protected void onPreExecute() {
Log.d("Test onPreExecute.", "OK");
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.d("Result from server", result);
}
}
public void SetAlarm(Context context)
{
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, SmsReceiver.class);
i.setAction("ActionRetry");
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000 * 60 * 4, 1000 * 60 * 4, pi); // Millisec * Second * Minute
}
public void CancelAlarm(Context context)
{
Intent intent = new Intent(context, SmsReceiver.class);
intent.setAction("ActionRetry");
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
公共类SmsReceiver扩展了BroadcastReceiver{
静态布尔报警集;
静态整数计数;
公共void onReceive(上下文、意图){
最后一个字符串ACTION_SMS_RECEIVED=“android.provider.Telephony.SMS_RECEIVED”;
String action=intent.getAction();
if(action.equals(action_SMS_RECEIVED)| | action.equals(“ActionRetry”)){
Log.d(“SmsReceiver广播触发”,“正常”);
ConnectivityManager ConnectivityManager=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_服务);
NetworkInfo NetworkInfo=connectivityManager.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isConnected()){
Log.d(“互联网已连接”,“flagAlarmSet设置为:“+flagAlarmSet”);
//如果(flagAlarmSet){//已删除
计数=0;
flagAlarmSet=false;
取消报警(上下文);
日志d(“警报取消”、“警报”);
//}//删除
//启动AsyncTask即使未设置此标志,您也可以在中第一次使用internet
试一试{
d(“执行任务(),“确定”);
新建任务()。执行(“http://somedomain.tld/index.php?userId=12345678");
}捕获(例外e){
Log.d(“任务执行错误”、“失败”);
e、 printStackTrace();
}
}
if(networkInfo==null){
如果(!flagAlarmSet){
Log.d(“Internet未连接。”,“计划重试”);
flagAlarmSet=true;
设置报警(上下文);
Log.d(“报警集”、“报警”);
}
否则{
计数++;
如果(计数>=5){
Log.d(“互联网未连接。”,“达到最大尝试次数,取消报警”);
计数=0;
flagAlarmSet=false;
取消报警(上下文);
}
}
}
}
}
类任务扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…arg0){
字符串文本=空;
试一试{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(arg0[0]);
HttpResponse resp=httpclient.execute(httppost);
HttpEntity ent=resp.getEntity();
text=EntityUtils.toString(ent);
}捕获(例外e){
e、 printStackTrace();
}
返回文本;
}
@凌驾
受保护的void onPreExecute(){
Log.d(“预先执行测试”,“正常”);
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
Log.d(“来自服务器的结果”,结果);
}
}
公共无效设置报警(上下文)
{
AlarmManager am=(AlarmManager)context.getSystemService(context.ALARM\u服务);
意图i=新意图(上下文,SmsReceiver.class);
i、 setAction(“ActionRetry”);
PendingIntent pi=PendingIntent.getBroadcast(上下文,0,i,0);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+1000*60*4,1000*60*4,pi);//毫秒*秒*分钟
}
公共无效取消报警(上下文)
{
意向意向=新意向(上下文,SmsReceiver.class);
intent.setAction(“ActionRetry”);
PendingEvent发送方=PendingEvent.getBroadcast(上下文,0,意图,0);
AlarmManager AlarmManager=(AlarmManager)context.getSystemService(context.ALARM\u服务);
alarmManager.cancel(发送方);
}
}
编辑:1
已更新代码,但如果没有可用的internet连接,SetAlarm仍不会被触发。我来自PHP背景。在PHP中,使用cron作业设置重复任务很容易。但这是我第一次编写Java代码。到目前为止,AsyncTask工作得很好,但是我真的不知道在哪里增加count做这些事情
编辑:2
更新代码
编辑:3
更新代码。现在开始工作了 解决此问题的一种方法是,如果没有可用的internet,则使用PendingEvent和AlarmManager重新安排时间 类似于以下内容(您需要更新flagAlarmSet并在适当的情况下计数): 对于计划/取消报警,类似于此:
public void SetAlarm(Context context)
{
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, SmsReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 4, pi); // Millisec * Second * Minute
}
public void CancelAlarm(Context context)
{
Intent intent = new Intent(context, SmsReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
参考:
还有一件事需要注意,如果您计划使用收到的消息,则需要以某种方式缓存该消息,以便在重新安排的PendingEvent中使用
请参阅getMessagesFromIntent()
文档:
例如:
编辑:在此处重新设置您的计数:
else{
if (count >= 5){
Log.d("Network is NOT connected.", "Max Tries Reached, Cancel Alarm");
count = 0;
flagAlarmSet = false;
CancelAlarm(context);
}
编辑2:好的,我想我知道问题出在哪里了。您需要在意图中添加操作,
else{
if (count >= 5){
Log.d("Network is NOT connected.", "Max Tries Reached, Cancel Alarm");
count = 0;
flagAlarmSet = false;
CancelAlarm(context);
}
public class SmsReceiver extends BroadcastReceiver {
static boolean flagAlarmSet;
static int count;
public void onReceive(Context context, Intent intent) {
final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
String action = intent.getAction();
if (action.equals(ACTION_SMS_RECEIVED) || action.equals("ActionRetry")) {
Log.d("SmsReceiver Broadcast triggered", "OK");
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
Log.d("Network is connected. Executing TheTask()", "OK");
Log.d("connected", "flagAlarmSet to: " + flagAlarmSet);
//if (flagAlarmSet) { //Removed
count = 0;
flagAlarmSet = false;
CancelAlarm(context);
Log.d("Alarm cancelled", "Alarm");
//} //Removed
//start AsyncTask even if flag was not set, you could have internet the first time in
try {
Log.d("SmsReceiver Broadcast triggered", "OK");
new TheTask().execute("http://somedomain.tld/index.php?userId=12345678");
} catch (Exception e) {
Log.d("TheTask Execution Error", "FAIL");
e.printStackTrace();
}
}
if (networkInfo == null) {
Log.d("Network is NOT connected.", "FAIL");
if (!flagAlarmSet){
Log.d("Network is NOT connected.", "Schedule Retry");
flagAlarmSet = true;
SetAlarm(context);
Log.d("Alarm Set", "Alarm");
}
else{
count++;
if (count >= 5){
Log.d("Network is NOT connected.", "Max Tries Reached, Cancel Alarm");
count = 0;
flagAlarmSet = false;
CancelAlarm(context);
}
}
}
}
}
class TheTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg0) {
String text = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(arg0[0]);
HttpResponse resp = httpclient.execute(httppost);
HttpEntity ent = resp.getEntity();
text = EntityUtils.toString(ent);
} catch (Exception e) {
e.printStackTrace();
}
return text;
}
@Override
protected void onPreExecute() {
Log.d("Test onPreExecute.", "OK");
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.d("Result from server", result);
}
}
public void SetAlarm(Context context)
{
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, SmsReceiver.class);
i.setAction("ActionRetry");
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000 * 60 * 4, 1000 * 60 * 4, pi); // Millisec * Second * Minute
}
public void CancelAlarm(Context context)
{
Intent intent = new Intent(context, SmsReceiver.class);
intent.setAction("ActionRetry");
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}