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