안드로이드 json 파싱후 데이터 질문입니다.


protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_service); this.getDatajson();

    test1 = savedInstanceState;
    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    navigation = (BottomNavigationView) findViewById(R.id.navigation);
    navigation.getMenu().getItem(0).setCheckable(false);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

    disableShiftMode(navigation);

    // 3사 프래그먼트 선언

    // 최초 화면 프래그먼트 생성
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.ac_add_sevice_frame_main, fragmentAddService_all).commit();
}

@Override
protected void onStart() {
    super.onStart();
}

@Override
protected void onResume() {
    this.setData();
    super.onResume();
}


@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.title_logout, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId())
    {
        case R.id.action_bt1:
            Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
            MenuItem menuItem = navigation.getMenu().getItem(position);
            menuItem.setChecked(false);
            break;
    }
    return true;
}

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.navigation_home:
                it = new Intent(AddServiceActivity.this , MainActivity.class);
                it.putExtra("home",0);
                startActivity(it);
                return true;
            case R.id.navigation_allmenu:
                it = new Intent(AddServiceActivity.this , MainActivity.class);
                it.putExtra("allmenu",1);
                startActivity(it);
                return true;
            case R.id.navigation_intcall:
                it = new Intent(AddServiceActivity.this , MainActivity.class);
                it.putExtra("intcall",2);
                startActivity(it);
                return true;
            case R.id.navigation_mypage:
                it = new Intent(AddServiceActivity.this , MainActivity.class);
                it.putExtra("mypage",3);
                startActivity(it);
                return true;
        }

        return false;
    }
};

private class pagerAdapter extends FragmentStatePagerAdapter {

    public pagerAdapter(android.support.v4.app.FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position)
        {
            case 0:
                return new Fragment_Home();

            case 1:
                return new Fragment_Allmenu();

            case 2:
                return new Fragment_Intcall();

            case 3:
                return new Fragment_Mypage();

            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return 4;
    }
}

public static void disableShiftMode(BottomNavigationView view) {
    BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);

    try {
        Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
        shiftingMode.setAccessible(true);
        shiftingMode.setBoolean(menuView, false);
        shiftingMode.setAccessible(false);

        for (int i = 0; i < menuView.getChildCount(); i++) {
            BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);

            item.setShiftingMode(false);
            item.setChecked(item.getItemData().isChecked());
        }
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
public boolean getDatajson()
{
    new Thread()
    {
        public void run()
        {
            try
            {
                URL url = new URL("(URL값)");
                InputStreamReader isr = new InputStreamReader(url.openConnection().getInputStream(), "EUC-KR");
                JSONObject object = (JSONObject) JSONValue.parse(isr);
                JSONArray listArray = (JSONArray) object.get("List");
                for(int i=0; i<listArray.size(); i++)
                {
                    JSONObject data = (JSONObject) listArray.get(i);
                    name = data.get("name").toString();
                    pw = data.get("pw").toString();
                    pass = data.get("pass").toString();
                    Log.d("Addservice",name+"");
                    Log.d("Addservice",pw+"");
                    Log.d("Addservice",pass+"");
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
                Log.d("1",e.getMessage());
                Log.d("2",e.toString());
            }

        }
    }.start();
    return true;
}
void setData()
{
    if(test1 == null)
    {
        try {
            commonSharePref.setValue(getApplicationContext(), "name", name);
            commonSharePref.setValue(getApplicationContext(), "pw", pw);
            commonSharePref.setValue(getApplicationContext(), "pass", pass);

            SharedPreferences prefs = getApplicationContext().getSharedPreferences("pref", Activity.MODE_PRIVATE);
            SharedPreferences.Editor ed = prefs.edit();
            ed.putString("name", name);
            ed.putString("pw", pw);
            ed.putString("pass", pass);
        }
        catch (NullPointerException e)
        {
            e.toString();
        }
        Log.d("MainActivity_Oncreate", name + "1");
        Log.d("MainActivity_Oncreate", pw + "1");
        Log.d("MainActivity_Oncreate", pass + "1");
    }
}

}

현재 jsp 에서 파싱한 URL 에 대해서 값을 가져와 파싱후 RecyclerView 에다가 뿌리는 작업을 하고있는데 먼저 현 액티비티에서 데이터를 가져와서 넘거야 하는데요 oncreate 에서 getdatajson 을 가져온후 onresume 때 받아온 값을 설정 할려고하는데 log 값보면 setdata 에 있는 로그값 (onresume) 값이 먼저 찍히고 oncreate 값은 늦게 찍혀서 json 값을 파싱을 해와도 값을 설정 못하네요.

  • 2017년 11월 07일에 작성됨

조회수 71


2 답변


안드로이드의 액티비티 라이프 사이클인 onCreate()와 onResume()은 메인 프로세스에서 돌아가고 있습니다. = 쓰레드 1

getDataJson() 함수는 new Thread().start() 로 새로운 쓰레드에서 돌아가고 있고요. = 쓰레드 2

쓰레드 1과 쓰레드 2는 서로 연동되지 않고 각자 돌아갑니다.

그래서 쓰레드 1에서 getDataJson() 함수는 쓰레드 2를 start() 하자마자 return true; 가 되어서 바로바로 다음 코드들을 실행하고 onResume() 으로 넘어갑니다. 여기서 운이 좋으면 쓰레드 2가 실행이 완료되고 데이터를 가지고 있을 수 있고 아니면 없을 수 도 있습니다.

해결 방법은 두 쓰레드를 연동시키는 것입니다. 쓰레드 2가 실행이 완료되고 데이터를 가지고 있는게 확인되면 쓰레드 1에게 신호를 줘서 이제 데이터를 사용해도 된다고, 질문자님의 setData() 메소드를 사용해도 된다고 신호를 주는것입니다.

가장 간단한 방법은 AsyncTask<> 입니다. AsyncTask<>.doInBackground()에서 쓰레드 2를 실행시키고 완료되면 자동으로 쓰레드 1을 수정할 수 있는 onPostExcute() 메소드를 실행 할 수 있습니다. 여기서 setData() 를 시작할 수 있을것입니다.

좀 더 나아가는 방법은 핸들러를 사용하는 방법입니다. 쓰레드 1에서 핸들러를 구현하고 쓰레드 2에서 1로 핸들메세지를 던지게 해, 쓰레드 1에서 해당 메세지를 받으면 setData() 를 시작하는 방법이 있습니다.

그리고 더욱 나아가서는 콜백 인터페이스 만드는 방법 혹은 RxJava 를 사용하는 방법이 있습니다.

감사합니다.

  • 2017년 11월 08일에 작성됨
    안드로이드 입문


답변 감사합니다 잘 해결했습니다 ^

  • 2017년 11월 09일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close