2011-08-21 55 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线程上执行的)