반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

오늘은 Debug mode로 돌리면서 2과 소스코드의 실행 순서를 하나하나 따라가 보기로 하겠습니다.


2과 소스코드는  아래 GitHub 에 가시면 받을 수 있습니다.


https://github.com/udacity/Sunshine-Version-2/tree/2.09_display_data

 



Break point 를 MainActivity.java 의 onCreate() 메소드의 if 문에 찍어 놨습니다.

보시듯이 이 앱을 실행하면 MainActivity 의 onCreate()메소드가 실행됩니다.

savedInstanceState는 Null 이구요 즉 처음 실행되는 거란 얘기죠.

그러면 if문의 조건을 만족하니까 그 내부의 코드들이 실행 될 겁니다.


그 전에 setContentView()에서 activity_main.xml에서 설정된 layout을 세팅합니다.

이 xml에는 한개의 FrameLayout이 세팅돼 있습니다.



여기서 그 다음 step 으로 넘어가면 if 문 안의 것이 실행될 겁니다.

안에는 위 xml에서 container라고 정의된 id 에 ForecastFragment() 클래스를 세팅합니다.



이제 ForecastFragment.java 파일로 넘어 갑니다.


제일 먼저 생성자인 ForecastFragment()로 갑니다. 일단 여기는 empty 입니다.

그 다음은 다시 MainActivity 로 넘어가서 if 문 안의 commit()부분이 실행됩니다.


그 다음 step over를 해 보면 안드로이드 자체 클래스들에 있는 메소드들이 실행 됩니다.

Activity.java > performCreate() 를 거쳐서 ActivityThread.java  에 있는 코드들이 실행 됩니다.


그 이후 다시 ForecastFragment클래스의 onCreate() 메소드로 가게 됩니다.



여기서는 setHasOptionsMenu(true); 를 설정해 놨죠.

옵션메뉴를 사용하겠다는 건데요.


그 다음 step over를 해 보면 Fragment.java > performCreate()를 거쳐 FragmentManager.java 클래스의 여러 코드들이 실행 됩니다.


그 다음에 가는 것이 ForecastFragment 클래스의 onCreateView() 메소드로 가게 됩니다.


아직 까지는 에뮬레이터에 아무것도 표시되지 않는데요. 이 onCreateView()를 지나게 되면 view가 표시 될 겁니다.





이 onCreateView()에서는 날씨 정보를 하드코딩해서 리스트에 넣고 ArrayAdapter를 사용해서 listview에 뿌릴 준비를 했습니다.


그리고 inflater를 사용해서 fragment_main.xml에 있는 layout을 로딩했죠.




이 Layout에는 ListView를 사용하도록 해 놨습니다.


보시면 이 ListView의 id 는 listview_forecast 인데요. onCreateView()에서는 이 아이디에 방금전에 사용했던 ArrayAdapter 를 대입해서 하드코딩한 데이터 정보들을 ListVIew에 넣었습니다.

그리고 이 ListView를 rootView에 넣어서 return 하게 됩니다.



그 다음 단계는 Fragment.java > performCreateView() 를 거쳐 FragmentManager, BackStackRecord , Instrumentation 클래스의  callActivityOnStart() 메소드, Activity, ActivityThread, Handler, Looper 클래스 등 여러 코드들을 실행합니다.


그러면 드디어 에뮬레이터에 데이터가 뿌려지게 됩니다.




그런데 잘 보시면 이 화면에는 옵션 메뉴가 없습니다.

아직 옵션메뉴 관련된 부분은 실행이 되지 않은 겁니다.


현재 디버거는 MainActivity 클래스의 onCreateOptionMenu()메소드에 와 있습니다.




여기서는 MenuInflater를 사용해서 manu에 있는 main.xml을 처리했습니다.



그 다음엔 안드로이드의 아래와 같은 클래스들을 거치면서 많은 메소드들이 실행됩니다.


Activity.java > onCreatePanelMenu() >>> FragmentActivity.java > onCreatePanelMenu() >>> ForecastFragment.java > onCreateOptionsMenu() >>> FragmentManager class >>> ActionBarActivity class >>> ActionBarActivityDelegate class >>> ActionBarActivityDelegateBase class >>> Handler class >>> Looper class 


그러면 옵션 메뉴가 표시됩니다.




위에서 ForecastFragment 클래스의 onCreateOptionMenu() 메소드도 실행 됐는데요.


여기서는 forecastfragment.xml 을 inflate 시켰습니다.


<?xml version="1.0" encoding="utf-8"?>

<
menu xmlns:android="http://schemas.android.com/apk/res/android"
   
xmlns:app="http://schemas.android.com/apk/res-auto">
    <
item android:id="@+id/action_refresh"
       
android:title="@string/action_refresh"
       
app:showAsAction="never" />
</
menu>


refresh 메뉴를 만든 겁니다.


이제 MainActivity클래스의 onOptionsItemSelected()도 로딩이 될 겁니다.



아직 Setting을 눌렀을 떄는 어떻게 해야 하는지는 코딩을 하지 않았습니다.

대신 Refresh 를 눌렀을 경우에는 ForecastFragment class의 onOptionsItemSelected() 메소드에서 처리 되도록 만들었습니다.


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
   
int id = item.getItemId();
    if (id == R.id.action_refresh) {
        FetchWeatherTask weatherTask = new FetchWeatherTask();
        weatherTask.execute("55347");
        return true;
    }
    return super.onOptionsItemSelected(item);
}


Refresh 를 누르면 FetchWeatherTask클래스에 55347이라는 파라미터를 던져줘서 그 클래스가 처리 되도록 합니다.


이 클래스에서는 이전 글에서 다뤘듯이 AsyncTask를 사용해서 네트워크 연결 부분을 Background Thread로 돌리고 날씨 웹에 request를 던져서 respons를 JSON형식으로 받은 다음에 이것을 파싱해서 화면에 뿌려주는 작업을 합니다.




그러면 이렇게 제가 사는 지역의 일주일 날씨 예보가 출력되게 됩니다.




자 여기까지 앱을 실행하면 실제로 소스코드가 어떤 순서로 실행되는지 하나하나 살펴 봤습니다.








반응형