마하카스
622
2021-06-17 09:57:02
4
100

안드로이드(java) 변수값 변경이 안되는 이유 알고 싶습니다.


public class MenuAdd extends BaseActivity{

    private ActivityMenuAdd mBinding

    private ArrayList<MyStoreMenuVO> mList

    private MenuAdapter mAdapter


     private int MenuCnt;


     @Override

     protected void onCreate(Bundle SavedInstanceState){

              super.onCreate(SavedInstanceState)

              ...

             initialize();

      }

 

      @Override

      protected void initialize(){

      mList = new ArrayList<>();

      mAdapter = new MenuAdapter(mContext, mList);

      requestStoreInfo();

      System.out.println(MenuCnt);


       }


       private void requestStoreInfo(){

       ...

       MenuCnt = data.Menu.size();   // data.Menu.size() ==2;

       System.out.println(MenuCnt)


        }


}


대략 이런 코드인데 requestInfo() 라는 메소드에서 

MenuCnt = 2 라고 값을 넣어주고 requestInfo에서는 MenuCnt가 2가 되는데


왜  Initialize() 안에서는 MenuCnt 가 0이 찍히는거죠???

클레스 내에 전역변수로 선언하면 클레스 내부에 있는 메소드 안에서 값을 대입할 때마다

바뀌어야 하는거 아닌가요?

 

 

0
  • 답변 4

  • HSYE
    179
    2021-06-17 12:51:03

    requestStoreInfo 내부 구현에서 스레드로 비동기 처리를 진행하나요? 

  • 마하카스
    622
    2021-06-17 13:35:33

    @hyeonseok

    제가 아직 초보라 클론코딩 위주라서 쓰레드 개념을 잘 몰라요 ㅠㅠ


    근데 또 오전에 개발하다보니 initialize 외에 다른 메소드에선 값 변경이 된채로 나와서

    다른메소드에서 정상적으로 출력이 되서 그대로 씁니다.


    근데 그래도 궁금하긴 합니다

  • CyanGlint
    950
    2021-06-17 16:37:02

    requestStoreInfo() 함수에서 서버에 메뉴가 몇개인지 확인하고 MenuCnt에 세팅해주는 구조인 것 같은데


    [UI쓰레드-requestStoreInfo] 비동기 쓰레드 실행

    [비동기쓰레드]         서버 조회 실행

    [UI쓰레드-requestStoreInfo] MenuCnt 조회 (이 시점에 아직 0임)

    [비동기쓰레드]         서버 조회 완료 (이 시점에 MenuCnt = 2)

    [UI쓰레드-다른 함수]         MenuCnt 조회 (이 시점에 MenuCnt = 2)


    정확하진 않더라도 대충 이런 순서라고 보시면 됩니다.


    쓰레드라는 아이한테 야 저기 가서 오늘 메뉴 몇개인지 알아보고 와서 칠판에 써 놔~ 라고 시켜놓고

    걔가 갔다왔는지 확인하지 않고 칠판에 몇개라고 써있는지 보려고 하는거에요.

    충분한 시간이 흐른 뒤에 보면 칠판에 2라고 써있겠지만, 그렇지 않으면 0이라고 써 있겠죠


    그래서 비동기 프로그래밍에는 콜백 = "갔다 오면 나한테 알려 줘" 라는 동작이 추가로 들어갑니다.

    Android AsyncTask에서는 onPostExecute가 이 일을 하는 함수이고

    다른 네트워킹 라이브러리(okhttp3 등)를 쓴다면 콜백을 인자로 받는 부분이 있을겁니다.

  • 마하카스
    622
    2021-06-18 09:04:06
  • 로그인을 하시면 답변을 등록할 수 있습니다.