Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果没有可用的internet连接,请重新安排AsyncTask以4分钟为间隔运行20分钟_Java_Android_Android Asynctask - Fatal编程技术网

Java 如果没有可用的internet连接,请重新安排AsyncTask以4分钟为间隔运行20分钟

Java 如果没有可用的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

我正在尝试在SmsReceiver广播上执行异步任务。我的代码的问题是,如果SMS广播接收器触发时没有可用的internet连接,则不会执行异步任务。如果没有可用的internet连接,我希望在接下来的20分钟内安排AsyncTask以4分钟的间隔运行5次。若在任何执行异步任务时从服务器获得响应,则取消下一次执行并更新UI。我可以在onPostExecute()中更新UI。我之前问过这个问题,但没有得到任何代码帮助。ScheduledExecutorService上有很多帖子可以安排AsyncTask以x分钟为间隔运行,但我找不到任何帖子可以将AsyncTask以x分钟为间隔运行x分钟。只有安卓官方网站上有a,但我不知道如何操作我的代码来工作。如果有人能帮助我,我将不胜感激

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);
}
公共类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);
    }
}