使用线程结果填充listview项(ArrayList)

时间:2011-08-21 11:51:37

标签: android multithreading listview

我正在尝试在android中填充我的列表视图(使用我自己的适配器) 一些线程返回的数据,从网站获取一些xml内容。 这工作正常!

使用返回的Array List对象正确填充List View。 这就是我的方式:

//.. 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 Adapter的东西移动到第二个单独的线程......但是它说没有列表视图适配器可以设置出主线程。 冻结后(有时应用程序崩溃...超时我不知道)数据将被分配给一些静态,这些静态在我自己的EfficientAdapter中使用。

是否可以等待线程A(刷新线程)的数据并使用返回的数据列表作为列表视图内容而不冻结整个应用程序?

我希望你明白这一点,因为我来自德国,而且我的英语并不完美。

1 个答案:

答案 0 :(得分:3)

是的,这是可能的。您可以使用AsyncTask(Android SDK的一部分)来实现这一目标。

  1. doInBackground()中建立你的arraylist。

  2. onProgressUpdate()中,您可以在处理期间更新UI线程上的结果。 (此方法在UI线程上执行。)

  3. onPostExecute()中,您处于完成流程后的阶段,您可以将结果发布到UI(此方法在UI线程上执行)