컨텍스트가 메소드 안에서 호출되는 시점에 null이 됩니다...

조회수 786회

일단 흐름은

  1. onAttach()에서 받아온 컨택스트를 전역변수 mContext에 저장. 이때 까지는 null이 아닙니다.

  2. public static void refreshSpinner() 호출. 여기서 public void setSpinner(ArrayList al) 호출

  3. public void setSpinner(ArrayList al) 호출됨. 여기서 mContext를 체크하면 null이 됩니다.

MyActivity.java

/*  MyActivity.java  */

private Context mContext;

    @Override
    public void onAttach(Context ctx){
        super.onAttach(ctx);
        mContext = ctx;
       //mContext와 ctx는 null이 아님
    }

public static void refreshSpinner(){
    File[] f = new File("경로...").listFiles();
    ArrayList l = new ArrayList();
    for(File a : f){
        l.add(a.getAbsolutePath());
    }
    new MyActivity().setSpinner(l);
}

public void setSpinner(ArrayList al){
   //여기서 체크시 mContext가 null로 찍힘
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_dropdown_item, al);
            spinner.setAdapter(adapter);
            spinner.setSelection(0);
}

이게 뭐가 어떻게 된 상황인가요?

분명 null이 아니었던게 메소드 내에서만 null이 되네요...

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 몇가지 알아야 할 것들이 있습니다.

    static 메소드는 첫번째 파라미터로 this 가 전달되지 않습니다.

    this.변수 형태로 인스턴스 변수에 접근할 수 있다는 것을 아실겁니다. 그것이 가능한 이유가 인스턴스 메소드일 경우에는 항상 첫 파라미터로 this가 자동으로 전달됩니다. 묵시적이라 못느낄뿐입니다. 그런데 static 메소드는 this가 전달이 안됩니다.

    onAttach는 콜백메소드입니다. 이 말은 객체 생성도 안드로이드 프레임워크내에서 되었을 겁니다.

    문제는 static 메소드인 refreshSpinner 에서 new MyActivity().setSpinner(l); 로 명시적으로 객체생성을 또 하고 있다는 겁니다. 이 객체는 onAttach 가 호출된 객체가 아닙니다.

    정리하면 새롭게 객체를 생성을 했기 때문에 onAttach 는 호출이 되지 않은 상태라 null 입니다.

    context 를 얻는 것은 아래링크의 도움말을 보세요.

    https://developer.android.com/reference/android/view/View.html#getContext%28%29

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)