2011-08-21 47 views
0

我想在Android中使用我的列表視圖(使用我自己的適配器) 與線程返回的一些數據,該線程從網站獲取一些xml內容。 這工作正常!用線程結果填充列表視圖項(ArrayList)

列表視圖用返回的數組列表對象正確填充。 這就是我做的方式:

//.. 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(){...}),因爲刷新線程不再是 並且已經結束。 這就是要點!我的完整線程在操作過程中凍結!我試着將listView適配器的東西移動到第二個單獨的線程中......但它說沒有列表視圖適配器可以設置在主線程之外。 凍結後(有時應用程序崩潰...超時我不知道)的數據將被分配給一些靜態,這是我自己的EfficientAdapter中使用。

是否有可能等待線程A(刷新線程)的數據並將返回的數組列表作爲列表視圖內容使用而不凍結整個應用程序?

我希望你明白了,因爲我來自德國,而且我的英語並不完美。

回答

3

是的,這是可能的。您可以使用作爲Android SDK的一部分的AsyncTask來完成此操作。

  1. doInBackground()你建立你的數組列表。

  2. onProgressUpdate()中,您可以在處理期間更新UI線程上的結果。 (這個方法在UI線程上執行)。

  3. onPostExecute()你在整理階段的處理後,也可以張貼結果向UI(這種方法在UI線程上執行的)