2011-08-21 4 views
0

내 목록보기를 자신의 어댑터를 사용하여 Android (내 어댑터 사용) 에 채우려고합니다. 일부 데이터는 웹 사이트에서 일부 XML 콘텐츠를 가져 오는 스레드에 의해 반환됩니다. 제대로 작동합니다!목록 결과를 스레드 결과 (ArrayList)로 채 웁니다.

목록보기가 반환 된 Array List 개체로 올바르게 채워집니다.

//.. function name blabla 
     ll_wait.setVisibility(View.VISIBLE); // A List View object displaying 'please wait' 
     lv1=(ListView)findViewById(R.id.listView1); 
     TextView tv1 = (TextView)findViewById(R.id.tv_Status); 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     String sortierung = prefs.getString("pref_sortierung", "Entfernung"); 
     String distanz = prefs.getString("pref_distance", "10"); 
     refreshElements refresh = new refreshElements(lat, lon, sortierung, distanz); // its a thread 
     refresh.start(); 
     while(refresh.isAlive()) { 
     // HERE IS MY PROBLEM 
     // HERE IS MY PROBLEM 
     // HERE IS MY PROBLEM 
     // HERE IS MY PROBLEM 
     } 
     try { 
      // assigning some data, works correctly 
      column_names = refresh.getElementColumn(1); 
      // assigning some data, works correctly 
      EfficientAdapter adapter = new EfficientAdapter(getApplicationContext()); 
      lv1.setAdapter(adapter); 
     } catch (Exception e) { 
      Toast.makeText(getApplicationContext(), e.getMessage() + e.getLocalizedMessage() + e.hashCode() + e.getCause() + e.toString(), Toast.LENGTH_SHORT).show(); 
     } 
     dialog.dismiss(); 
     ll_wait.setVisibility(View.GONE); 
// -... end of function 

당신이 볼 수 있듯이, 내 코드에서, "여기 내 문제입니다"라는 코멘트가 : 내가 그것을 할 방법을 이잖아. 물론 주 스레드가 대기합니다 (while() {...}) 결과로 새로 고침 스레드가 더 이상 살아 있지 않아 이 완료되어 완료되었습니다. 그리고 thats 요점! 작업 도중 내 전체 스레드가 정지 중입니다! 두 번째, 별도의 스레드로 listView 어댑터 물건을 이동하려고했습니다 ...하지만 목록보기 어댑터가 주 스레드에서 설정할 수 있다고 말한다. 동결 후 (때로는 응용 프로그램이 충돌 ... timeout i dunno) 데이터가 내 자신의 EfficientAdapter에서 사용 된 일부 통계에 할당됩니다.

스레드 A (새로 고침 스레드)의 데이터를 기다리고 반환 된 배열 목록을 전체 응용 프로그램을 고정하지 않고 목록보기 내용으로 사용할 수 있습니까?

나는 독일에서 왔고 나의 영어가 완벽하지 않기 때문에 당신이 요점을 얻길 바랍니다.

답변

3

예, 가능합니다. Android SDK의 일부인 AsyncTask을 사용하면이를 수행 할 수 있습니다.

  1. doInBackground()에서 arraylist를 빌드하십시오.

  2. onProgressUpdate()에서 처리 중에 UI 스레드의 결과를 업데이트 할 수 있습니다. (이 메소드는 UI 스레드에서 실행 됨). onPostExecute()에서

  3. 이 과정이 끝나면 단계에 있고 (이 방법은 UI 스레드에서 실행되는)

인터페이스에 결과를 게시 할
관련 문제