倒数计时器的随机空指针 onTick
Random null pointer onTick of countdowntimer
我的问题源于我的倒计时服务 class。 onTick 方法抛出随机空指针。足够随机,很难捕捉到,但每次都会使应用程序崩溃。
这是倒计时服务的代码 class
@Override
public void onCreate() {
super.onCreate();
stopNotify();
Log.i(TAG, "Starting timer...");
cdt = new CountDownTimer(900000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
String hms = String.format("%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
MainActivity.tv.setText(hms);
Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished / 1000);
bi.putExtra("countdown", millisUntilFinished);
sendBroadcast(bi);
}
@Override
public void onFinish() {
Log.i(TAG, "Timer finished");
showNotification();
savepref();
Intent intent = new Intent(BroadcastService.this, MainActivity.class);
intent.putExtra("id1",id1);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
};
cdt.start();
}
@Override
public void onDestroy() {
cdt.cancel();
Log.i(TAG, "Timer cancelled");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
更多代码
代码!!
private BroadcastReceiver br = new
BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent) {
updateGUI(intent); // or whatever method used to
update your GUI fields
}
};
private void updateGUI(Intent intent) {
if (intent.getExtras() != null) {
long millisUntilFinished =
intent.getLongExtra("countdown", 0);
Log.i(TAG, "Countdown seconds remaining: " +
millisUntilFinished / 1000);
}
}
不过,我不知道你的其余代码,但显然问题出在这一行
MainActivity.tv.setText(hms);
我猜,"tv"代表一个文本视图,你已经在MainActivity中的一个静态变量中获取了它。这变为空..
我的问题源于我的倒计时服务 class。 onTick 方法抛出随机空指针。足够随机,很难捕捉到,但每次都会使应用程序崩溃。 这是倒计时服务的代码 class
@Override
public void onCreate() {
super.onCreate();
stopNotify();
Log.i(TAG, "Starting timer...");
cdt = new CountDownTimer(900000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
String hms = String.format("%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
MainActivity.tv.setText(hms);
Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished / 1000);
bi.putExtra("countdown", millisUntilFinished);
sendBroadcast(bi);
}
@Override
public void onFinish() {
Log.i(TAG, "Timer finished");
showNotification();
savepref();
Intent intent = new Intent(BroadcastService.this, MainActivity.class);
intent.putExtra("id1",id1);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
};
cdt.start();
}
@Override
public void onDestroy() {
cdt.cancel();
Log.i(TAG, "Timer cancelled");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
更多代码 代码!!
private BroadcastReceiver br = new
BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent) {
updateGUI(intent); // or whatever method used to
update your GUI fields
}
};
private void updateGUI(Intent intent) {
if (intent.getExtras() != null) {
long millisUntilFinished =
intent.getLongExtra("countdown", 0);
Log.i(TAG, "Countdown seconds remaining: " +
millisUntilFinished / 1000);
}
}
不过,我不知道你的其余代码,但显然问题出在这一行
MainActivity.tv.setText(hms);
我猜,"tv"代表一个文本视图,你已经在MainActivity中的一个静态变量中获取了它。这变为空..