Java Android启动时接收器崩溃
我的手机已连接到Eclipse,但在手机“完全”启动并且在此之前我的接收器(应用程序)崩溃之前,我无法看到logcat,因此我无法调试它。我确信它与上下文和意图有关: 由于上下文问题,我的接收器在启动时崩溃,我确信:Java Android启动时接收器崩溃,java,android,android-intent,broadcastreceiver,boot,Java,Android,Android Intent,Broadcastreceiver,Boot,我的手机已连接到Eclipse,但在手机“完全”启动并且在此之前我的接收器(应用程序)崩溃之前,我无法看到logcat,因此我无法调试它。我确信它与上下文和意图有关: 由于上下文问题,我的接收器在启动时崩溃,我确信: public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Calendar c2 = Calendar.getInstance();
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Calendar c2 = Calendar.getInstance();
int hour = c2.get(Calendar.HOUR_OF_DAY);
int minute = c2.get(Calendar.MINUTE);
int sek = c2.get(Calendar.SECOND);
int dan;
int dodaj;
milivreme = ((hour * 60 * 60 * 1000)+ (minute * 60 * 1000) + (sek * 1000));
Cursor cursor = DatabaseManager.getAllData();
cursor.moveToFirst();
if (!cursor.isAfterLast())
{
do
{
milibaza = cursor.getInt(3);
razlika = milibaza - milivreme;
Intent intent1 = new Intent(context, AlarmReceiver.class);
PendingIntent pendingintent = PendingIntent.getService(context, 2, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + razlika, pendingintent);
}
while (cursor.moveToNext());
}
}
更新,最终成功捕获异常:
01-06 02:21:19.920: E/AndroidRuntime(7360): java.lang.RuntimeException: Unable to start receiver com.example.prva.OnBootReceiver: java.lang.NullPointerException
您应该使用context,用context替换contextic,这样您就可以了。因为您的代码还不清楚问题所在,但有一些建议供您参考 1) 变量
milivreme
,milibaza
等必须是长型而不是int型
2) 使用milivreme=System.currentTimeMillis()代替下面的代码代码>以毫秒为单位给出当前时间
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int sek = c.get(Calendar.SECOND);
int dan;
int dodaj;
milivreme = ((hour * 60 * 60 * 1000)+ (minute * 60 * 1000) + (sek * 1000));
3) 检查游标是否不为空。在cursor.moveToFirst()之前代码>
4) 请参见此行>>
PendingIntent pendingintent = PendingIntent.getService(context, 2, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
您应该使用Context-Context
,不要使用Context-contextic
private Context contextic; // NEEDLEES !
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int sek = c.get(Calendar.SECOND);
int dan;
int dodaj;
milivreme = ((hour * 60 * 60 * 1000)+ (minute * 60 * 1000) + (sek * 1000));
Cursor cursor = DatabaseManager.getAllData();
cursor.moveToFirst();
if (!cursor.isAfterLast())
{
do
{
milibaza = cursor.getInt(3);
razlika = milibaza - milivreme;
Intent intent1 = new Intent(context, AlarmReceiver.class);
PendingIntent pendingintent = PendingIntent.getService(context, 2, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE); //CONTEXT !
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + razlika, pendingintent);
}
while (cursor.moveToNext());
}}
我的问题是:为什么要编写while(cursor.moveToNext())代码>(问题是在循环后使用分号)
如果我的回答没有帮助,请提供堆栈跟踪。已更改为您所说的内容,但在启动时仍会崩溃(请检查编辑的问题)。^是的。顺便说一句,改变了你所说的内容,仍然在开机时崩溃。(检查编辑的问题)您是否在AndroidManifest.xml中注册了接收者?是的,我注册了。我的清单中有这样的内容:
谢谢你的建议,我编辑了我的代码和我的问题。不幸的是,我在boot.dude上仍然遇到同样的崩溃。你不应该播放System.currentTimeMillis();在int中,必须将变量更改为long。你们知道int和long的限制吗?改变long变量中与时间相关的所有内容,你们可能会在数据库中插入错误的值,提高你们的java技能!!对不起,我只是从这里复制粘贴得太快了,所以…我知道限制,我知道存储的数字都在限制之内。无论如何,这不是主要的问题,当然…更新了我的问题。尽管如此,crashingI可以打赌你不懂Java基础知识,否则在提到三次应该使用长值来存储时间之后,int就不能使用了。你怎么知道这不是问题所在。对不起,我不能再帮你了。首先学习Java的基础知识。为什么你要让回答者保持在猜测之下?附加logcat堆栈跟踪(应用程序崩溃时出现的红色输出,前提是您的手机上有USB调试(默认情况下模拟器会这样做)),然后让它进行对话。另外,接收者有10秒的时间来做他们的工作,我不明白为什么你会有一个while循环。@a--C我已经告诉过你了,读我的第一句话。Logcat没有捕捉到错误,因为我猜错误发生在Logcat捕捉到错误之前。如果我能发布日志,我会很高兴。从命令行使用adb Logcat,应该会更快。您还可以创建一个将异常写入磁盘的异常处理程序。最后,重新开始,你有很多事情可能会出错。此外,上下文是一个上下文,除非您正在转换其他内容,否则这不是问题。您还可以更改此接收器,使其侦听自定义广播,然后在任何地方广播。你有相当多的可能性进行堆栈跟踪。很好cursor
很有可能为空,所以这是我首先要检查的。另外,由于您捕获了异常,您是否有完整的日志?如果你这样做,应该有一个行号的地方。