如果没有可用的互联网连接,请重新安排AsyncTask在接下来的20分钟内运行,间隔为4分钟

Amandeep Singh |

我正在尝试在SmsReceiver Broadcast上执行AsyncTask我的代码的问题在于,如果在SMS广播接收器触发时没有互联网连接可用,则AsyncTask不会执行。如果没有可用的互联网连接,我想安排AsyncTask在接下来的20分钟内以4分钟的间隔运行5次。如果执行任何AsyncTask,都会收到服务器的响应,然后取消下一次执行并更新UI。我可以在onPostExecute()中更新UI。我之前在这里问过这个问题但是没有任何代码帮助。ScheduledExecutorService上有很多帖子安排AsyncTask以x分钟的间隔运行,但是我找不到任何提及AsyncTask以x分钟的间隔运行x分钟的消息。仅在Android官方网站上有Beeper示例,但我不明白如何操作代码以使其正常工作。如果有人可以帮助我,使我有义务使此代码正常工作。

SmsReceiver.java

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);
}

}

编辑:1

更新了代码,但是如果仍然没有Internet连接可用,则不会触发SetAlarm我来自PHP背景。在PHP中,使用cron作业设置重复任务很容易。但这是我第一次编写Java代码。到现在为止,AsyncTask可以正常运行,但是我真的不知道所有这些东西在哪里增加计数

编辑:2

更新的代码。

编辑:3

更新的代码。现在正在工作。

丹尼尔·纽金特

解决此问题的一种方法是使用PendingIntent和AlarmManager重新安排没有互联网可用的时间。

这样的事情(您将需要更新flagAlarmSet并在适当的地方计数):

if (networkInfo != null && networkInfo.isConnected()) {
    Log.d("Network is connected. Executing TheTask()", "OK");

    if (flagAlarmSet == true){
       flagAlarmSet = false;
       CancelAlarm(context);
    }

    new TheTask().execute("http://somedomain.tld/index.php?userId=12345678");

}

if (networkInfo == null) {
   Log.d("Network is NOT connected.", "FAIL");
   if (flagAlarmSet == false){
       Log.d("Network is NOT connected.", "Schedule Retry");
       flagAlarmSet = true;
       SetAlarm(context);
   }
   else{
      if (count > 5){
          Log.d("Network is NOT connected.", "Max Tries Reached, Cancel Alarm");
          flagAlarmSet = false;
          CancelAlarm(context);
      }

   }
}

像这样安排/取消警报:

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);
 }

参考:警报管理器示例

需要注意的另一件事是,如果您打算使用接收到的消息,则需要以某种方式缓存该消息以在重新计划的PendingIntent中使用。

请参阅getMessagesFromIntent()文档:

https://developer.android.com/reference/android/provider/Telephony.Sms.Intents.html#getMessagesFromIntent(android.content.Intent)

示例:在Android中发送和接收SMS和MMS(Kit Kat之前的Android 4.4)

编辑:在此处重新设置计数:

         else{
            if (count >= 5){
                Log.d("Network is NOT connected.", "Max Tries Reached, Cancel Alarm");
                count = 0;
                flagAlarmSet = false;
                CancelAlarm(context);
            }

编辑2:好的,我想我明白了问题所在。您将需要向该意图添加一个动作,并在中查找“ ActionRetry” onReceive()

我刚刚测试了它,它可以工作。

看一下下面的更新代码:

    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);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果没有可用的互联网连接,请重新安排AsyncTask在接下来的20分钟内运行,间隔为4分钟

来自分类Dev

接下来的N小时内每五分钟有Cron表达?

来自分类Dev

如果当前行值> 10并且上一行<10,我想在接下来的30分钟内输出MAX(值)

来自分类Dev

vb.net DateTime.Now和接下来的15分钟

来自分类Dev

每隔30分钟检查一次后台服务中的互联网连接

来自分类Dev

如果在2分钟内处于空闲状态,请重新加载页面

来自分类Dev

SQL:计算从首次出现到接下来的五分钟内某个值的出现,然后为下一次出现重复相同的值

来自分类Dev

如果前后1分钟或2分钟,如何舍入到最接近的5分钟间隔?

来自分类Dev

会话超时(如果15分钟内没有任何活动不起作用)?

来自分类Dev

以5分钟为间隔对DataFrame进行分组

来自分类Dev

mysql最流行的页面,间隔为5分钟

来自分类Dev

以小时为间隔插入15分钟的日期时间

来自分类Dev

在Lua中将时间间隔为5分钟

来自分类Dev

每次运行后20分钟运行线程

来自分类Dev

简单的SQL查询需要20分钟才能运行?

来自分类Dev

如何使cron在10分钟的间隔内仅运行42次?

来自分类Dev

在1分钟间隔内为熊猫DataFrame的行分配最后一个值

来自分类Dev

以10分钟的间隔连接和绘制具有不同时间的数据

来自分类Dev

RRDtool的设置间隔为5分钟,但每30分钟发送一次数据吗?

来自分类Dev

将分钟递增至最近的15分钟间隔

来自分类Dev

网页在三分钟内没有生成输出并消失。连接将在哪里死亡?

来自分类Dev

仅运行setInterval 5分钟?

来自分类Dev

在5分钟内安装Roo

来自分类Dev

在5分钟内安装Roo

来自分类Dev

将日志间隔从10分钟更改为1分钟

来自分类Dev

Momentjs每天休息4分钟?

来自分类Dev

rufus-scheduler有没有办法从上一次运行的作业开始,每5分钟安排一次作业?

来自分类Dev

每小时:00分钟和:30分钟重新加载页面

来自分类Dev

如何将csv中缺少的日期(间隔为15分钟)点存储到新文件中(间隔为15分钟)-python 3.5

Related 相关文章

  1. 1

    如果没有可用的互联网连接,请重新安排AsyncTask在接下来的20分钟内运行,间隔为4分钟

  2. 2

    接下来的N小时内每五分钟有Cron表达?

  3. 3

    如果当前行值> 10并且上一行<10,我想在接下来的30分钟内输出MAX(值)

  4. 4

    vb.net DateTime.Now和接下来的15分钟

  5. 5

    每隔30分钟检查一次后台服务中的互联网连接

  6. 6

    如果在2分钟内处于空闲状态,请重新加载页面

  7. 7

    SQL:计算从首次出现到接下来的五分钟内某个值的出现,然后为下一次出现重复相同的值

  8. 8

    如果前后1分钟或2分钟,如何舍入到最接近的5分钟间隔?

  9. 9

    会话超时(如果15分钟内没有任何活动不起作用)?

  10. 10

    以5分钟为间隔对DataFrame进行分组

  11. 11

    mysql最流行的页面,间隔为5分钟

  12. 12

    以小时为间隔插入15分钟的日期时间

  13. 13

    在Lua中将时间间隔为5分钟

  14. 14

    每次运行后20分钟运行线程

  15. 15

    简单的SQL查询需要20分钟才能运行?

  16. 16

    如何使cron在10分钟的间隔内仅运行42次?

  17. 17

    在1分钟间隔内为熊猫DataFrame的行分配最后一个值

  18. 18

    以10分钟的间隔连接和绘制具有不同时间的数据

  19. 19

    RRDtool的设置间隔为5分钟,但每30分钟发送一次数据吗?

  20. 20

    将分钟递增至最近的15分钟间隔

  21. 21

    网页在三分钟内没有生成输出并消失。连接将在哪里死亡?

  22. 22

    仅运行setInterval 5分钟?

  23. 23

    在5分钟内安装Roo

  24. 24

    在5分钟内安装Roo

  25. 25

    将日志间隔从10分钟更改为1分钟

  26. 26

    Momentjs每天休息4分钟?

  27. 27

    rufus-scheduler有没有办法从上一次运行的作业开始,每5分钟安排一次作业?

  28. 28

    每小时:00分钟和:30分钟重新加载页面

  29. 29

    如何将csv中缺少的日期(间隔为15分钟)点存储到新文件中(间隔为15分钟)-python 3.5

热门标签

归档