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

將這段代碼

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

'context'爲空。 –

回答

0

ActivityContext,因此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人會立即理解這個問題。讓我試試:)如已經評論過的,上下文變量爲空,並且使用它會導致(「拋出」)NullPointerException。現在有兩種選擇,在使用它之前分配上下文變量,就像這個答案中的第二個代碼塊一樣。或者,不要在'new Intent(...)'中傳遞上下文變量,而是使用Countdown.this,它是對周圍類的實例的引用,該類是AppCompatActivity的超類,它是Context的超類。 – Micha

+1

@Micha隨意自己解答。我不需要知道這些事情 –

1

有一個在代碼片段沒有上下文的發起和如前所述,你並不需要在活動課上下文對象。

您可以

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

alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 
相關問題