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

时间:2017-06-29 09:44:34

标签: java android scheduled-tasks

我试图在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(“”,“我在15秒后跑步”) - >>在日志中打印行

但是当我把我的代码放到那时它不起作用,就像代码没有运行一样。

任何人都可以提出建议吗,对菜鸟来说真的很有帮助。

1 个答案:

答案 0 :(得分:2)

run方法换入try-catch块。

只是一个猜测:抛出异常。如果遇到异常,ScheduledExecutorService会静默停止。

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

如果您尝试在尝试捕获之前创建一个Looper并将其打开,那么它将正常工作,因为您无法处理来自工作线程的UI线程。