如何在Android的AlarmManager中更新SQLite数据库值
我有一段代码,只需点击一下按钮就可以很好地运行,但现在我需要在报警服务中自动运行它。当我调用要在如何在Android的AlarmManager中更新SQLite数据库值,android,sqlite,alarmmanager,Android,Sqlite,Alarmmanager,我有一段代码,只需点击一下按钮就可以很好地运行,但现在我需要在报警服务中自动运行它。当我调用要在**Runnable**接口中执行的方法(updateDays())时,根本不会调用它。数据库未按预期更新。我真的做对了吗 DbAdapter mDbHelper; Cursor mCursor; Runnable mUpdateTask = new Runnable() { public void run() { long maxWaitTime = System.curr
**Runnable**
接口中执行的方法(updateDays()
)时,根本不会调用它。数据库未按预期更新。我真的做对了吗
DbAdapter mDbHelper;
Cursor mCursor;
Runnable mUpdateTask = new Runnable() {
public void run() {
long maxWaitTime = System.currentTimeMillis() + 10*1000;
while (System.currentTimeMillis() < maxWaitTime) {
synchronized (mBinder) {
try {
updateDays();
mBinder.wait(maxWaitTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}
}
private void updateDays() {
mDbHelper.open();
if(mCursor != null) {
mDbHelper.updateDL (DbAdapter.KEY_ID,
mCursor.getInt(mCursor.getColumnIndex(DbAdapter.KEY_DAYS))-1,
DbAdapter.KEY_DATE_TIME);
mDbHelper.close();
Toast.makeText(this, "Update done !", Toast.LENGTH_SHORT).show();
}
编辑2
我的服务**onCreate**
方法
@Override
public void onCreate() {
mNofitication = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
displayNotification();
Thread tr = new Thread(null, mUpdateTask, "AlarmService");
tr.start();
}
根据您的要求,我觉得您需要在使用报警管理器的同时使用待定的意图。下面显示了一个相同的示例:
//Creating a PendingIntent
Intent intent = new Intent(MainActivity.this, MyService.class);
PendingIntent pendingIntent = PendingIntent.getService(
MainActivity.this, UNIQUE_ID_RANDOM, intent, 0);
//Creating an AlarmManager and setting the pendingIntent to him
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
+ (5 * 1000), pendingIntent);
Toast.makeText(MainActivity.this, "Alarm set in " + 5 + " seconds",
Toast.LENGTH_SHORT).show();
现在,在服务中,您可以在5秒钟后启动,您可以输入上述代码并进行尝试。以下是示例:
public class MyService extends Service{
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Your database opening code should come here. But take care of the syntax related constructs.
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
我希望这对你有帮助
问候,
Zax我能看到的唯一方法是,如果您的服务覆盖了
onCreate()
,并且没有链接到超类,那么您可以在的第116行获得NullPointerException
。按照以下说明检查与崩溃相关的Java堆栈跟踪:如果您无法解释该堆栈跟踪,编辑您的问题以提供它。@commonware,谢谢您的否决投票,但看起来您并没有正确理解我。我在上面的代码解释中说我得到了空指针异常。其次,在地球上约70亿人中,你是唯一一个可能知道你在哪里得到NullPointerException
的人。这就是为什么我建议,如果您无法解释堆栈跟踪,请编辑您的问题以提供它。为了能够帮助您,我们需要知道您在代码中的什么地方触发了NullPointerException
@Dadani:问题还不错,只是您没有提供足够的信息让某人给出答案。投票赞成这个问题。@Commonware,对不起,我认为是你投了反对票,因为你是我看到的唯一一个发表评论的人,我无法知道是谁投了反对票。谢谢你的建议。为了清晰起见,我添加了更多信息。谢谢,但我使用的是alarm manager,而不是操作系统GC提供的简单服务。在我的例子中,时间是至关重要的。我已经添加了onCreate方法及其内容,请检查它是否是导致问题的方法。@Dadani:正如我在回答中指出的,您没有链接到超类。调用super.onCreate()
,这是您在onCreate()
方法中所做的第一件事。让我尝试一下,并尽快回复您。谢谢您,它已经成功了。但是,这只回答了有关NullPointerException
的问题的第一部分。数据库仍然没有更新。根本不会调用方法updateDays()
。
public class MyService extends Service{
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Your database opening code should come here. But take care of the syntax related constructs.
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}