2013-02-02 2 views
1

필자의 전화가 이클립스에 연결되어 있지만 "완전히"부팅 될 때까지 로그캣을 볼 수 없으며 리시버 (어플리케이션)가 충돌하기 전에 디버깅 할 수 없습니다.안드로이드 부팅시 수신자 크래킹

내 수신기가 있기 때문에 상황에 맞는 문제의 부팅에 충돌되어 확실 해요 : : 나는 상황과 의도와 뭔가 관련이있다 확신

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 
+0

왜 답변자를 추측하지 못하게합니까? 귀하의 logcat 스택 추적 (귀하의 응용 프로그램이 충돌 할 때 발생하는 빨간색 출력, 휴대 전화에서 USB 디버깅이 제공된다면 (에뮬레이터는 기본적으로 그렇게합니다). 또한 리시버는 작업을 수행하는 데 10 초 밖에 걸리지 않습니다. 왜 거기에 루프가 있는지 알 수 없습니다. –

+0

@ A - C 이미 말씀 드렸습니다. 첫 문장을 읽었습니다. Logcat이 오류를 잡을 수 있기 전에 Logcat이 오류를 잡아 내지 못합니다. Logcat을 게시 할 수 있다면 기쁠 것입니다. – user1880779

+0

명령 줄에서 adb logcat을 사용하면 빠릅니다. 예외를 디스크에 기록하는 Exception 핸들러를 만들 수도 있습니다. 마지막으로, 신선한 시작, 당신은 잘못 갈 수있는 많은 것들이 있습니다. 또한 컨텍스트는 컨텍스트입니다. 줄 바꿈 이외의 다른 곳으로 캐스팅하지 않으면 문제가되지 않습니다. –

답변

0

당신은 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()); 쓰기습니까?

내 대답이 도움이되지 않는다면, 추적을 스택하십시오.

+1

'while (...);은 바로 앞에있는'do {...} '에 속합니다. – 323go

+0

^예. BTW. 당신이 말한 것과 맥락이 바뀌었고 부팅시에도 여전히 충돌합니다. (편집 된 질문 확인) – user1880779

+0

좀 더 자세한 내용으로 내 질문을 업데이트했습니다! – user1880779

1

컨텍스트를 사용하고 컨텍스트를 컨텍스트로 바꾸면됩니다.

+0

당신이 말한 것으로 바뀌었고 부팅시 여전히 충돌합니다 (편집 된 질문 확인). – user1880779

+0

좀 더 자세한 내용으로 내 질문을 업데이트했습니다! – user1880779

1

문제는 코드에서 분명하지 않지만 몇 가지 제안 사항이 있습니다.

1) 변수 milivreme, milibaza 등은 int 대신 long 유형이어야합니다.

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) 커서가 null이 아닌지 확인하십시오. cursor.moveToFirst();

4) 전에

PendingIntent pendingintent = PendingIntent.getService(context, 2, intent1, PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
+0

제안에 감사드립니다. 내 코드와 제 질문을 편집했습니다. 불행히도 부팅시 여전히 동일한 충돌이 발생합니다. – user1880779

+0

당신은 System.currentTimeMillis(); int로 변경하려면 변수를 long으로 변경해야합니다.int와 long의 한계를 아십니까? – AAnkit

+0

긴 변수에서 시간과 관련된 모든 것을 변경합니다. 데이터베이스에 잘못된 값을 삽입하고 Java 기술을 향상시킬 수 있습니다! – AAnkit