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이 점점 나 해결 방법을하는 방법입니다 이유를 이해하지 않습니다 - 나는 확실히 잘못 여기에 몇 가지 물건을하고있는 중이 야하지만 난 알아낼 수있는다음 단계입니다. 어떤 도움이라도 도움이 될 것입니다! Activity

+1

이 코드

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

를 대체 할 수있는'context'은 null입니다. –

답변

0

그러므로 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이며 NullPointerException을 발생시킨다 ("throws"). 이제이 대답의 두 번째 코드 블록 에서처럼 두 가지 옵션 중 하나를 사용하기 전에 컨텍스트 변수를 할당하십시오. 또는'new Intent (...) '에서 컨텍스트 변수를 전달하는 대신 주변 클래스의 인스턴스에 대한 참조 인 Countdown.this를 사용하십시오.이 클래스는 Context의 수퍼 클래스 인 AppCompatActivity의 수퍼 클래스입니다. – Micha

+1

@Micha 스스로 대답 해주십시오. 나는이 것들을 알 필요가 없다. –

1

할당해야합니다.

당신은

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

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