0

Я действительно новичок в Android Studio (и относительно новичок в Java), и я пытаюсь создать приложение, которое позволит пользователю вводить время и иметь таймер начните отсчет, когда это произойдет. Изучив его, кажется, что использование намерения - лучший способ пойти, но у меня возникают некоторые проблемы с пониманием того, как его использовать. Прямо сейчас, у меня есть следующий код в моем главном файле деятельности (так называемый обратный отсчет):Создание тревоги с намерением и с некоторыми проблемами

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); 



    } 
});}} 

И в моем файле приемника у меня есть:

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(); 
} 
} 

Прямо сейчас, запустив отладчик, я получаю это сообщение :

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) 

Я пытался смотреть на это, но я просто не понимаю, почему я получаю NullPointerException или как это исправить - я определенно делать некоторые вещи неправильно здесь, но я не могу понять, чтоследующий шаг. Любая помощь была бы очень полезной!

+1

'context' является недействительным. –

ответ

0

Activity является Context, поэтому Context context не является необходимым, и вы можете использовать Countdown.this вместо того, чтобы использовать переменную context здесь.

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

Или вам нужно на самом деле присвоить context

private Context; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

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

Хотя вы правы, я не уверен, что кто-то, совершенно новый для Java, сразу поймет эту проблему. Позвольте мне попробовать :) Как уже отмечалось, контекстная переменная имеет значение null, а ее использование вызывает («throws») исключение NullPointerException. Теперь есть два варианта: либо назначьте переменную контекста перед ее использованием, как и во втором блоке кода в этом ответе. Или вместо передачи контекстной переменной в 'new Intent (...)' используйте Countdown.this, которая является ссылкой на экземпляр окружающего класса, который является суперклассом AppCompatActivity, который является суперклассом Context. – Micha

+1

@Micha Не стесняйтесь отвечать по своему усмотрению. Мне не нужно знать эти вещи –

1

Там нет инициация контекста в фрагменте кода и, как уже упоминалось, вам не нужен объект контекста в классе деятельности.

Вы можете заменить этот код

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

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

с

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^