안드로이드 json 파싱후 데이터 질문입니다.
조회수 1548회
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 값을 파싱을 해와도 값을 설정 못하네요.
-
(•́ ✖ •̀)
알 수 없는 사용자
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 를 사용하는 방법이 있습니다.
감사합니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
댓글 입력