简体   繁体   English

null 创建通知管理器时指针异常

[英]null pointer exception when creating notificationmanager

When I try to start a service, i get a null pointer exception which is caused by instantiating a notificationmanager.当我尝试启动服务时,我得到一个 null 指针异常,这是由实例化通知管理器引起的。 This seems fairly simple, just instantiating, but this one line of code causes the application to crash.这看起来相当简单,只是实例化,但是这一行代码导致应用程序崩溃。

What is the cause of this problem?这个问题的原因是什么?

starting service in onStop method:在 onStop 方法中启动服务:

@Override
    protected void onStop() {
        super.onStop();
        Intent notifService = new Intent(getApplicationContext(), NotificationService.class);
        startService(notifService);
    }

service class:服务 class:

package ch.zli.eb.myfitnessjourney.service;


public class NotificationService extends Service {
    private String channelId = "myfitnessjourney_1";
    private int notificationId = 101;

    NotificationManager notifManager = getSystemService(NotificationManager.class);

    private LocalBinder myBinder = new LocalBinder();

    private Timer notifTimer;
    private TimerTask notifTimerTask;

    private final int intervalSec = 5;

    private Handler notifHandler;


    public NotificationService() throws ParseException {
        createNotificationChannel();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return myBinder;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        try {
            startTimer();
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return START_STICKY;
    }


    @Override
    public void onCreate() {
    }

    @Override
    public void onDestroy() {
        stopTimerTask();
        super.onDestroy();
    }

    public void startTimer() throws ParseException {
        notifTimer = new Timer();

        initializeTimerTask();

        notifTimer.schedule(notifTimerTask, 5000, intervalSec * 1000);
    }

    public void stopTimerTask() {
        if (notifTimer != null) {
            notifTimer.cancel();
            notifTimer = null;
        }
    }

    public void initializeTimerTask() throws ParseException {
        DbManager dbManager = new DbManager(this);
        ArrayList<Goal> goalList = dbManager.getGoals();

        // REQUIRED DATE FORMAT
        DateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy");
        dateFormatter.setLenient(false);
        Date todaysDate = dateFormatter.parse(dateFormatter.format(new Date()));

        notifTimerTask = new TimerTask() {
            public void run() {
                notifHandler = new Handler();
                notifHandler.post(new Runnable() {
                    public void run() {
                        for (Goal g : goalList) {
                            if (g.isReminders()) {
                                if (g.getEndDate().compareTo(todaysDate) == 0) {
                                    sendNotification(g);
                                }
                            }
                        }

                    }
                });
            }
        };
    }

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String notifTitle = "Title";
            String notifDesc = "Description";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;

            NotificationChannel notifChannel = new NotificationChannel(channelId, notifTitle, importance);
            notifManager.createNotificationChannel(notifChannel);
        }
    }

    private void sendNotification(Goal g) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
                .setContentTitle("Goal Deadline")
                .setContentText(g.getName() + "is about to pass the deadline!")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);

        notifManager.notify(notificationId, builder.build());
    }

    public class LocalBinder extends Binder {
        NotificationService getService() {
            return NotificationService.this;
        }
    }
}

getSystemService(Class serviceClass) is a method of abstract class Context. getSystemService(Class serviceClass) 是抽象 class 上下文的方法。 So if you are calling this method from a non-activity class, you will need to pass the context of the activity class to your service class.因此,如果您从非活动 class 调用此方法,则需要将活动 class 的上下文传递给您的服务 class。 You can pass this in a constructor.您可以在构造函数中传递它。

Context mContext;
public NotificationService(Context mContext) {
    this.mContext = mContext;
}

NotificationManager notifManager = mContext.getSystemService(NotificationManager.class);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM