마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

setRepeating 의 null object reference 질문입니다.

0 추천

현재 제가 구현 하고 있는 것은 

재부팅을 했을때, 재부팅을 인지 하여, 이전에 등록했던 알람들을 디비에서 가져와 재등록 하는 기능입니다.

재부팅을 인지하고, 이전에 등록했던 알람들을 디비에서 검색을 하고 정보를 가져오는건 성공 했습니다.

하지만 문제는 정보를 가지고 알람을 등록하는 부분에서 오류가 나네요.

_am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 5000, pIntent );

이부분에서 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.AlarmManager.setRepeating(int, long, long, android.app.PendingIntent)' on a null object reference 이런 오류가 납니다. 찾아보니까 알람매니저(_am)를 초기화 해주지 않아서 일어난다는데, 전 분명

초기화를 해줬는데도 이러네요.  조언 부탁드리겠습니다!!

재부팅을 감지하게 되면

public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if ( action.equals(Intent.ACTION_BOOT_COMPLETED) ) {      //재부팅 감지

            mDbOpenHelper = new alarm_DbOpenHelper(context.getApplicationContext());
            try {
                mDbOpenHelper.open();   //디비 먼저 열고~
            } catch (SQLException e) {
                e.printStackTrace();
            }
            alarm_DbOpenHelper.reRegist(context);

        }
    }

 

alarm_DbOpenHelper.reRegist(Context context)

public static Cursor reRegist(Context context) {           //재부팅 하면 활성화 된 놈들을 찾아서 알람에 삽입
        Cursor c = mDB.rawQuery( "Select _id, hour, minute, apm, day from alarm_table where BUTTON ='on'", null);

        if (c != null && c.getCount() != 0) {
            c.moveToNext();
           
            MainActivity.alarm_reRegist(context,c.getInt(0), c.getInt(1), c.getInt(2), c.getString(3), c.getInt(4));
        }
        return c;
    }

 

public static void alarm_reRegist(Context context, int getid, int hour, int minute, String apm, int day)

public class MainActivity extends AppCompatActivity {
    //final DBHelper dbHelper = new DBHelper(getActivi(), "alarm.db", null, 1);
    private static final String TAG = "TestDataBase";
    private static AlarmManager _am;
    public static Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.AppThemeBlue);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        _am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    }   //알람 매니저를 등록안 상태 입니다.
public static void alarm_reRegist(Context context, int getid, int hour, int minute, String apm, int day){

        boolean[] week = {false, false,false,false,false,false,false,false};  //테스트 용
       
        Intent intent = new Intent(context, alarm_Receiver.class);
        intent.putExtra("weekday", week);
        PendingIntent pIntent = PendingIntent.getBroadcast(context, getid, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        Calendar cal = Calendar.getInstance();

        if(apm.equals("오후")){   //설정한 시간으로 시간 세팅
            cal.set(Calendar.HOUR_OF_DAY, hour+12);
        }else{
            cal.set(Calendar.HOUR_OF_DAY, hour);
        }
        cal.set(Calendar.MINUTE, minute);
        cal.set(Calendar.SECOND, 0);

        _am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 5000, pIntent); //여기서 에러가 납니다

    }

 

감사합니다!

 

 

패기백배개발자 (700 포인트) 님이 2016년 5월 11일 질문

2개의 답변

0 추천
_am이 null입니다.
익명사용자 님이 2016년 5월 12일 답변
0 추천
_am을 oncreate에 정의하셨는데 onReceive는 재부팅 하자마자 _am을 사용하려고 하니 당연히 널이 되지요.

_am = getSystemService~~~ 를 alarm_reRegist안에 정의해주세요. 그럼 문제없겠네요
고수가되고싶어요 (720 포인트) 님이 2016년 7월 18일 답변
...