2013-09-06 2 views
0

나는 Activity가 ListView입니다. AsyncTask을 사용하여 서버에서 데이터를 가져 와서 목록에 채 웁니다.서버에 새 데이터를 보내면 ListView를 새로 고칩니다.

작업 표시 줄을 클릭하면 새로운 활동이 시작됩니다 (대화 상자와 같은 스타일) - 사용자가 일부 데이터 클릭을 "보내기"하고 서버에 보냅니다. 그런 다음이 Dialog-Activity가 닫히고 목록을 새로 고치고 새 데이터를 추가 할 때 이전 대화 상자로 돌아갑니다.

onResume() 메서드에서 AsyncTask를 실행하려고 시도했지만 이전 데이터와 함께 새 데이터를 가져 오는 동안 AsyncTask가 onCreate()에서도 실행되기 때문에 두 번 모두 가져옵니다.

1) 처음으로 활동이 onStart, onCreate and onResume까지 진행되므로 목록 데이터가 두 번 표시됩니다. 플래그와 같은 것을 사용하여 처음으로 활동 시작시 해당 코드가 실행되지 않아야합니까?

2) 서버의 데이터를 채우는 이래로 notifyDataSetChanged이 어떻게 도움이되는지 생각할 수 없습니다. 확장 어댑터가 ArrayAdapter입니다.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 


    JSONSpotTask task = new JSONSpotTask();  //task 
    task.execute(); 
    try { 
     task.get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 

    list1 = (ListView) findViewById(R.id.listview1); 
    ta = new TipsAdapter(this, R.layout.row_list_item, results); 
    list1.setAdapter(ta); 


} 



@Override 
protected void onResume() {      
    super.onResume();        

    JSONSpotTask task = new JSONSpotTask();  //task 
    task.execute(); 
    try { 
     task.get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 

    list1 = (ListView) findViewById(R.id.listview1); 
    ta = new TipsAdapter(this, R.layout.row_list_item, results); 
    list1.setAdapter(ta); 
} 

코드는

+0

문제는 익숙하다고 생각합니다. 전체 소스 코드가 도움이 될 것입니다! –

+0

onResume()에서 AsyncTask ** 만 실행해도 문제가 없지만 AsyncTask 코드를 onResume()에서 실행하고 onCreate()에서 아무것도 실행하지 않아도됩니까? – test2558

+0

예 - 내 대답을보십시오 - 아마 그 방법이 더 좋습니다. –

답변

2

생성 루프는 항상 onResumeonCreate 후, 당신은 단지 onResume()의 목록 데이터를 표시해야 할 것입니다 점을 감안 감사드립니다. 그런 다음 처음 실행시에만 한 번 수행되며 활동이 포 그라운드로 올 때마다 수행됩니다.

포어 그라운드에서 항상 다시 실행해야 할 필요가 없다는 것을 알고 있다면 onCreate과 "대화 상자"Activity에 설정된 플래그를 사용합니다. 그러나 항상 onResume에 항상 다시 표시하는 것이 더 안전하다는 사실을 알고 계실 것입니다.

+0

그것이 작동 할 수있는 유일한 방법 인 것처럼 보이기 때문에 당분간은 그대로 두겠습니다. – test2558

0

결과 배열을 업데이트 한 경우에만 notifdatasetchanges를 사용해야합니다. 그렇지 않으면 onPostExecute 콜백에 결과 배열이있는 새 어댑터를 만들어 목록보기에 바인딩해야합니다.

관련 문제