1

電話をEclipseに接続していますが、電話が「完全に」起動され、その前にレシーバー(アプリケーション)がクラッシュするまでlogcatが表示されないため、デバッグできません。私はそれが文脈と意図で何かをしなければならないと確信しています:

コンテキストの問題が原因で、起動時にレシーバーがクラッシュしていると確信しています。

 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
4

3 に答える 3

1

コンテキストを使用し、コンテキストをコンテキストに置き換えれば、問題はありません。

于 2013-02-02T14:45:49.503 に答える
1

コードの問題は明確ではありませんが、いくつかの提案があります。

1)変数などはmilivrememilibazaintではなく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);
于 2013-02-02T14:53:34.417 に答える
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());(ループの後にセミコロンを使用するということです)?

私の答えが役に立たない場合は、スタックトレースをお願いします。

于 2013-02-02T14:54:10.733 に答える