0

Je suis vraiment nouveau à Android Studio (et relativement nouveau à Java aussi), et j'essaye de créer une application qui permettra à l'utilisateur d'entrer une heure et avoir un temporisateur commencer à décompter quand ce moment se produit. Après l'avoir examiné, il semble que l'utilisation d'une intention soit la meilleure solution, mais j'ai quelques difficultés à comprendre comment l'utiliser. En ce moment, je le code suivant dans mon fichier d'activité principale (appelé compte à rebours):Créer une alarme en utilisant une intention et avoir quelques problèmes

public class Countdown extends AppCompatActivity { 
EditText mHours; 
EditText mMinutes; 
TextView mDisplay; 
public static long finalTime = 0; 
private AlarmManager alarmMgr; 
private PendingIntent alarmIntent; 
Context context; 

@Override 
public void onCreate(Bundle savedInstanceState) { 


    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_countdown); 
    mHours = (EditText) findViewById(R.id.text1); 
    mMinutes = (EditText) findViewById(R.id.text2); 
    mDisplay = (TextView) findViewById(R.id.display); 
    Button button = (Button) findViewById(R.id.button1); 

    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      calendar.set(Calendar.HOUR_OF_DAY, 11); 
      calendar.set(Calendar.MINUTE, 22); 
      Intent intent = new Intent(context, Countdown.class); 
      alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

      alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
      alarmMgr.set(AlarmManager.RTC, calendar.getTimeInMillis(), alarmIntent); 

      final long hourInput = Long.parseLong(mHours.getText().toString()); 
      final long minuteInput = Long.parseLong(mMinutes.getText().toString()); 
      finalTime = (hourInput * 3600000) + (minuteInput * 60000); 



    } 
});}} 

Et dans mon dossier récepteur j'ai:

public class CountdownStarter { 
TextView mDisplay; 
public void onRecieve() { 

    final CountDownTimer aCounter = new CountDownTimer(Countdown.finalTime, 1000) { 

     public void onTick(long millisUntilFinished) { 
      mDisplay.setText("Seconds remaining: " + millisUntilFinished/1000); 
     } 

     public void onFinish() { 
      mDisplay.setText("Finished"); 
     } 
    }; 
    aCounter.start(); 
} 
} 

En ce moment, l'exécution du débogueur je reçois ce message :

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.android.timerexample, PID: 32276 
       java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
        at android.content.ComponentName.<init>(ComponentName.java:128) 
        at android.content.Intent.<init>(Intent.java:5283) 
        at com.example.android.timerexample.Countdown$1.onClick(Countdown.java:42) 
        at android.view.View.performClick(View.java:5702) 
        at android.widget.TextView.performClick(TextView.java:10888) 
        at android.view.View$PerformClick.run(View.java:22533) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7229) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

je tentais de regarder en elle, mais je ne comprends pas pourquoi je reçois le NullPointerException ou comment réparer - je fais vraiment des trucs mal ici, mais je ne peux pas comprendre ce que la prochaine étape est. Toute aide serait très utile!

+1

'context' est nulle. –

Répondre

0

Un Activity est un Context donc Context context n'est pas nécessaire et vous pouvez utiliser Countdown.this au lieu d'utiliser une variable context ici.

Intent intent = new Intent(context, Countdown.class); // here 
alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // and here 

Ou vous devez attribuer réellement context

private Context; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_countdown); 
    context = this; // Here 
+0

Alors que vous avez raison, je ne suis pas sûr que quelqu'un de nouveau à Java comprendra immédiatement le problème. Laissez-moi essayer :) Comme déjà commenté, la variable de contexte est null, et l'utiliser provoque ("throws") une exception NullPointerException. Maintenant, il y a deux options, soit assigner la variable de contexte avant de l'utiliser, comme dans le deuxième bloc de code dans cette réponse. Ou, au lieu de passer la variable de contexte dans 'new Intent (...)', utilisez Countdown.this, qui est une référence à l'instance de la classe environnante, qui est une super-classe de AppCompatActivity, qui est une super-classe de Context. – Micha

+1

@Micha N'hésitez pas à répondre par vous-même. Je n'ai pas besoin de savoir ces choses –

1

Il n'y a pas d'initiation du contexte dans l'extrait de code et comme déjà mentionné, vous n'avez pas besoin d'un objet de contexte dans une classe d'activité.

Vous pouvez remplacer ce code

Intent intent = new Intent(context, Countdown.class); 
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

avec

Intent intent = new Intent(this, Countdown.class); 
alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);