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); 
相关问题