2012-11-26 7 views
1

첫 번째 Android 앱을 만들고 있습니다. 페이지 중 하나에서 REST 서비스를 사용하여 Drupal 사이트에 연결하고 일부 데이터 (비디오 URL 목록, 제목, 설명 등)를 검색하여 목록에 표시해야합니다. 목록을 클릭하면 동영상의 세부 정보로 이동합니다.asynchTask가 끝날 때까지 대기

다음은 진행 방법입니다. 1 ° drupal 사이트의 모든 데이터를 가져 오는 중입니다. 2 ° 목록의 항목을 클릭하면 해당 비디오의 세부 사항을 다음 활동으로 전달합니다.

문제는 다음과 같습니다. android 3+에서 인터넷에 연결할 때 주 스레드에서 실행할 수 없으므로 AsyncTask를 사용하여 데이터를 가져와야했습니다. 이 작업은 끝났지 만 비디오를 ArrayList에 저장 한 다음 getVideos() 또는 getVideo (index) 함수를 사용하여 해당 목록에 액세스하려고합니다. 첫 번째는 목록을 채우고 두 번째는 세부 활동으로 이동하기 전에 데이터를 검색합니다. 문제는 동영상 목록에 액세스하려고 할 때 목록이 채워지지 않았다는 것입니다.

기술적으로 나는 asynctask를 실제로 사용할 필요가 없거나 사용하고 싶지 않지만, 주 스레드에서 인터넷에 연결하는 것은 오류를 던져서 적절한 방법이 아니라고 말합니다.

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_videos_list); 
     //get all videos (not yet filled since faster than second thread) 
     List<Video> videos = videoDao.getVideos(); 
     //get a list of all the titles to display as the list 
     List<String> formattedVideos = VideoHelper.formatVideosList(videos); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, formattedVideos); 

     ListView listView = (ListView) findViewById(R.id.videos_list); 
     listView.setAdapter(adapter); 
     listView.setOnItemClickListener(new VideosListItemClickListener(this)); 
    } 

그래서 질문은 정말 이것이다 :

public class VideoDaoImpl { 
     private List<Video> videos ; 

     public VideoDaoImpl(){ 
      videos = new ArrayList<Video>(); 
      new VideoTask(...).execute(); //fetch the videos in json format and 
      //call function onRemoteVideoCallComplete using a handler 
      //in the onPostExecute() function of the asyncTask 
     } 

     public List<Video> getVideos() { 
      return videos; 
     } 

     public Video getVideo(int index){ 
      return videos.get(index); 
     } 

     public onRemoteVideoCallComplete(JSONObject json) { 
      //transform Json into videos and add them to the videos arraylist 
     } 

    } 

이 내가 내 활동에 동영상 목록을 입력하는 방법입니다 : 여기

내가 비디오를 얻는 방법에 대한 단순화 된 버전입니다 . 이것에 더 좋은 방법이 있을까, 또는리스트가 채워지기를 기다리는 방법이있다.

답변

2

나는 AsyncTask를 그대로 유지하지만 onPostExecute()를 사용합니다. onPostExecute() 내부에서 Json을 비디오 객체 목록으로 변환 한 다음이 형식의 비디오 목록을 만듭니다. 그런 다음 형식이 지정된 비디오 목록을 활동으로 다시 전달하는 메소드를 호출하여 목록을 설정합니다. 당신의 비동기 내부 예를 들어

:

protected void onPostExecute(Json result) { 
    //Create list of videos from json 
    //Create formatted list 
    //call method in activity to set list e.g activity.setList(formatted List) 
} 
+0

필자는 결국이 솔루션을 선택했습니다 (postExecute에서는 수행하지 않지만 VideoDaoImpl 클래스로 돌아가려면 처리기를 사용합니다). – Vilcoyote

+0

또한 Android Query는 사람들에게 흥미로울 수 있습니다. 매우 간단하게 작동합니다. 나중에 너무 많이 발견되었습니다. http://code.google.com/p/android-query/ – Vilcoyote

0

귀하의 접근 방식을 사용하면 예상되는 행동이 귀하가 직면 한 행동, 즉 동영상 목록이 채워지지 않은 행동으로 바뀝니다. 당신은 assynchronous 방법을 사용하지만, 동 기적으로 생각하고 문제를 다루고, 당신은 당신의 코멘트 에 따라, 그것을 알고 당신의 onPostExecute 방법에

videoDao.getVideos(); 

를 호출해야 "아직 두 번째 스레드보다 빠른 이후 작성되지 않았습니다" 또는 후에. 나는 그런 것을 할 것입니다. 초안이라고 생각하십시오. 완벽한 해결책은 아닙니다.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_videos_list); 
    new VideoTask(...).execute(); // you should a use a something on your onPreExecute() inside this task showing a ProgressDialog so the user knows that something is "loading videos, please wait" 

    List<Video> videos = videoDao.getVideos(); 
    if (!videos.isEmtpy()) { 
     //get a list of all the titles to display as the list 
     List<String> formattedVideos = VideoHelper.formatVideosList(videos); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, formattedVideos); 

     ListView listView = (ListView) findViewById(R.id.videos_list); 
     listView.setAdapter(adapter); 
     listView.setOnItemClickListener(new VideosListItemClickListener(this)); 
    } 
} 

차이점은 기본적으로 VideoDAO에서 AsyncTask를 추출 할 수 있다는 것입니다. ProgressDialog로 실행하여 무언가가 진행되고 있음을 알리고 비디오 목록이 채워 졌는지 확인하십시오. 그렇다면 videos_list에 동영상을 표시하십시오. 물론 대략적인 초안 일 뿐이지 만 당신이 아이디어를 얻을 수 있다고 생각합니다.

+0

안녕하세요, 답변 주셔서 감사합니다. 이것은 videoDao의 전체 목적이 비디오 목록을 얻는 것이었기 때문에 내가 바라는 것이 아닙니다. 나는 비디오 (데이터 지향)를 가져 와서 목록을 채우는 (UI 지향적 인) 작업으로 분리하기를 원했기 때문에 활동의 목록보기를 채우는 사람이되기를 원하지 않았습니다. 나는 시간의 이유 때문에 결국 그것을했다. – Vilcoyote

관련 문제