亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述Android BroadcastReceiver数据库访问与房间相关的知识,希望能为你提供帮助。
我已经设置了一个闹钟,每小时都会拨打一个广播接收器。此接收器尝试从sqlite数据库加载数据。
问题是,提醒列表为空。相同的代码在活动中起作用,但在接收器中起作用。有什么我必须改变来访问接收器中的数据库。这是活动和接收器中不同上下文的问题吗?
“setAlarm”方法是我使用的方法,用于在活动上创建警报。
问候
public class AppReceiver extends BroadcastReceiver {private static final String TAG = "AppReceiver";
@Override
public void onReceive(Context context, Intent intent) {
ReminderRepository mRepository;
= new ReminderRepository(context);
List<
Reminder>
list = mRepository.getAllReminder();
for(Reminder r : list) {
// TODO
}
}
}public class ReminderRepository {private ReminderDao mReminderDao;
private List<
Reminder>
mAllReminder;
public DisposalCalenderRepository(Context context) {
ReminderRoomDatabase db = ReminderRoomDatabase.getDatabase(context);
mReminderDao = db.reminderDao();
mAllReminder = mReminderDao.getAll();
}public List<
Reminder>
getAllReminder(){
return mAllReminder;
}}@Dao
public interface ReminderDao {@Query("SELECT * from reminder")
List<
Reminder>
getAll();
}public void setAlarm(){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.HOUR, 1);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
AlarmManager alarmMgr = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(mContext, AppReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(mContext, 0, i, 0);
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_HOUR, alarmIntent);
}
答案我找到了两个可能的问题答案。
解决方案1:启动异步任务。创建一个AsyncTask类并在doBackground方法中执行这些操作。访问数据库没有问题。
@Override
public void onReceive(Context context, Intent intent) {
new notifyAsyncTask().execute(context);
}private static class notifyAsyncTask extends AsyncTask<
Context, Void, Void>
{private String CHANNEL_ID = "1a2b3c4d";
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@Override
protected Void doInBackground(Context... params) {
Log.i(TAG, "Notify async started");
ReminderRepository mRepository;
= new ReminderRepository(context);
List<
Reminder>
list = mRepository.getAllReminder();
for(Reminder r : list) {
// TODO
}
}
}
解决方案2:允许在主线程上进行查询。构建数据库时,使用allowMainThreadQueries()允许在主线程上进行查询。
【Android BroadcastReceiver数据库访问与房间】!!!!注意!!!!不建议 !!!!注意!!!!
推荐阅读
- BroadcastReceiver在Android上没有按预期工作
- BroadcastReceiver和AlarmManager Android
- 如何在android中阅读所有即将发布的通知
- 没有为android.media.tv.action.INITIALIZE_PROGRAMS发送BroadcastReceiver通知
- HTML5如何改变网络安全性()
- 保护NodJS应用程序免受在线威胁的10种工具
- 如何测试和修复Heartbleed SSL漏洞()
- 如何在Ubuntu 18上安装GRR()
- 8种不同的Google警告消息以及它们为什么发生()