为啥计划任务执行固定速率中的代码不起作用?

Posted

技术标签:

【中文标题】为啥计划任务执行固定速率中的代码不起作用?【英文标题】:Why the code in schedule Task Execution fixed Rate not working?为什么计划任务执行固定速率中的代码不起作用? 【发布时间】:2017-12-02 22:48:24 【问题描述】:

我正在尝试在 android 中添加 Sheduled Task 的功能,以便在一段时间后执行某些操作,例如我想知道每当用户失去他的互联网连接时,我想发出一个警报对话框。所以我使用 Sheduled Task Execution 来做这件事,但是每当我将运行代码放入 Runnable 时,Task 都不起作用。

重要的是我在服务类中这样做

代码是

package com.example.sid.marwadishaadi.LoginHistory;

import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
 import android.os.IBinder;
import android.provider.Settings;
   import android.support.v7.app.AlertDialog;
  import android.util.Log;
     import android.widget.Toast;

    import java.util.concurrent.Executors;

   import java.util.concurrent.ScheduledExecutorService;
  import java.util.concurrent.TimeUnit;

     import static com.bumptech.glide.gifdecoder.GifHeaderParser.TAG;

       public class OnClearFromRecentService extends Service 

            @Override
            public IBinder onBind(Intent intent) 
                return null;
            

            @Override
            public int onStartCommand(Intent intent, int flags, int startId) 
                Log.e("ClearFromRecentService-", "-----------------------------------------Service Started");
                SharedPreferences sharedPreferences=getSharedPreferences("userinfo",MODE_PRIVATE);
                SharedPreferences.Editor edtr=sharedPreferences.edit();
                String id=sharedPreferences.getString("customer_id","");
                Log.e(TAG, "onStartCommand: .........................."+id);
                if(isOnline()) 
                    Toast.makeText(this, "You are online", Toast.LENGTH_SHORT).show();
                

                ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
                scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() 
                    public void run()                             

                        Log.i(TAG, "run: ----I'm running after 15 seconds");
                        if(isOnline()) 
                            //Dummy TODO, you can do something if you want, 
                            Toast.makeText(OnClearFromRecentService.this, "You are not online", Toast.LENGTH_SHORT).show();
                        

                        else
                            Log.i(TAG, "run: --- exited from here or not :::: yes ");
                            AlertDialog.Builder network =new AlertDialog.Builder(OnClearFromRecentService.this);
                            network.setTitle("No Internet");
                            network.setMessage("Please check your internet connection or go to the internet option by clicking #settings");
                            network.setPositiveButton("Settings", new DialogInterface.OnClickListener() 
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) 
                                    getApplicationContext().startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                                
                            );
                            network.setNegativeButton("Exit", new DialogInterface.OnClickListener() 
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) 
                                    Intent intent = new Intent(Intent.ACTION_MAIN);
                                    intent.addCategory(Intent.CATEGORY_HOME);
                                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                
                            );
                            network.setCancelable(false);
                            AlertDialog alertDialog = network.create();
                            alertDialog.show();


                        

                    
                , 0, 15, TimeUnit.SECONDS);

                return START_NOT_STICKY;
            

        public boolean isOnline() 
    ConnectivityManager conMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = conMgr.getActiveNetworkInfo();

    if(netInfo == null || !netInfo.isConnected() || !netInfo.isAvailable())
        Toast.makeText(getApplicationContext(), "No Internet connection!", Toast.LENGTH_LONG).show();
        return false;
    
    return true;




            @Override
            public void onDestroy() 
                super.onDestroy();
                Log.e("ClearFromRecentService-", "-----------------------------------Service Destroyed");
            

            @Override
            public void onTaskRemoved(Intent rootIntent) 
                Log.e("Clearvi--------------", "---------------------------------END");
                //Code here

                stopSelf();
            


         

当我没有在计划任务中做某事并打印单行时,就像

log.e("","I'm running after 15 sec") -->> print line in log

但是当我把我的代码然后它不起作用,就像代码没有运行一样。

任何人都可以提出一些建议,这对新手很有帮助。

【问题讨论】:

任何错误日志? @Kaushal28 日志中没有错误 尝试使用try catch 包装您的代码并检查错误。否则它应该可以正常工作。 @Kaushal28 这对我很有帮助,谢谢 +1。 您可以通过点击投票标志下方的小勾来接受答案。 ***.com/help/someone-answers 【参考方案1】:

将您的 run 方法包装在 try-catch 块中。

只是猜测:正在引发异常。如果遇到异常,ScheduledExecutorService 会静默停止。

run 方法的代码应始终由try-catch 包围,以处理和吸收任何抛出的异常。

如果您在尝试捕获之前尝试制作 Looper 并将其打开,那么它将正常工作,因为您无法从工作线程处理 UI 线程。

【讨论】:

是的,它工作但每次它抛出异常。错误是意外异常,looper 无法处理视图活动部分 谢谢,我发现错误并在尝试捕获之前制作了一个弯针,它工作得很好,谢谢+1

以上是关于为啥计划任务执行固定速率中的代码不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 VB 中的代码不起作用? [关闭]

我的linux定时任务不起作用是为啥?

我的linux定时任务不起作用是为啥?

html table 中的td宽度为啥不起作用

设置为以系统帐户运行时计划任务不起作用

通过 Windows 任务计划程序调用 SSIS 包时,发送邮件任务在 SSIS 中不起作用