首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自xml的android异步加载列表

来自xml的android异步加载列表
EN

Stack Overflow用户
提问于 2012-03-19 03:51:02
回答 3查看 534关注 0票数 0

我正在从url加载一个xml数据并将其绑定到一个列表。

这个过程需要一些时间,视图是混乱的。

我想实现异步任务的代码,以便它将在后台加载或显示一个进度对话框。

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;

public class XmlActivity extends ListActivity {
    private class LoadDataTask extends AsyncTask<Object, Object, Object> {
        @Override
        protected Object doInBackground(final Object... urls) {
            fillData();

            return null;
        }

        @Override
        protected void onPostExecute(final Object result) {
            closeDialog();
        }

        @Override
        protected void onPreExecute() {
            showDialog();
        }
    }

    private NumbersDataSource datasource;
    private ProgressDialog dialog;

    public void fillData() {

        datasource = new NumbersDataSource(this);
        datasource.open();

        List<Number> values = datasource.getAllNumbers();
        datasource.close();

        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

        String xml = XMLfunctions
                .getXML("http://www.xxxxxx.com/products.xml");
        Document doc = XMLfunctions.XMLfromString(xml);

        NodeList nodes = doc.getElementsByTagName("item");

        String temp = "";

        for (int i = 0; i < nodes.getLength(); i++) {
            HashMap<String, String> map = new HashMap<String, String>();

            Element e = (Element) nodes.item(i);
            map.put("category", XMLfunctions.getValue(e, "category"));
            map.put("title", XMLfunctions.getValue(e, "title"));
            map.put("description", XMLfunctions.getValue(e, "description"));
            map.put("pubDate", XMLfunctions.getValue(e, "pubDate"));
            map.put("link", XMLfunctions.getValue(e, "link"));

            String str2array = XMLfunctions.getValue(e, "description");
            String[] arr = str2array.split(",");

            String tempResults = "";
            for (int x = 0; x < arr.length; x++) {
                String tempWin = arr[x].trim();

                Iterator<Number> itr = values.iterator();
                while (itr.hasNext()) {

                    Number number = (Number) itr.next();

                    tempResults += number.hasWin(tempWin);

                }

            }
            if (tempResults.equals(""))
                map.put("results", getText(R.string.no_win).toString());
            else
                map.put("results", getText(R.string.win).toString());

            if (temp == "") {
                temp = XMLfunctions.getValue(e, "pubDate");
            }

            if (temp.equals(XMLfunctions.getValue(e, "pubDate"))) {
                mylist.add(map);
            }

        }

        ListAdapter adapter = new SimpleAdapter(this, mylist,
                R.layout.xml_row_list, new String[] { "category", "title",
                        "description", "pubDate", "results" }, new int[] {
                        R.id.item_category, R.id.item_title,
                        R.id.item_description, R.id.item_pubDate,
                        R.id.item_link });

        setListAdapter(adapter);

    }

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xml_list);
        // fillData();
        new LoadDataTask().execute();

    }

    @Override
    protected void onResume() {
        super.onResume();
        // fillData();
    }

    private void closeDialog() {
        if (dialog != null) {
            dialog.dismiss();
        }
    }

    private void showDialog() {
        if (dialog != null && !dialog.isShowing()) {
            dialog = new ProgressDialog(this);
            dialog.setMessage("Loading. Please wait...");
            dialog.show();
        }
    }
}

fillData中的ProgressDialog从不显示。我得到了一个错误

代码语言:javascript
复制
03-19 21:13:38.535: E/AndroidRuntime(1669): FATAL EXCEPTION: AsyncTask #2
03-19 21:13:38.535: E/AndroidRuntime(1669): java.lang.RuntimeException: An error occured while executing doInBackground()
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at java.lang.Thread.run(Thread.java:1019)
03-19 21:13:38.535: E/AndroidRuntime(1669): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.ViewRoot.checkThread(ViewRoot.java:3035)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.ViewRoot.requestLayout(ViewRoot.java:637)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.requestLayout(View.java:8320)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.setFlags(View.java:4694)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.view.View.setVisibility(View.java:3169)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.widget.AdapterView.updateEmptyStatus(AdapterView.java:727)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.widget.AdapterView.checkFocus(AdapterView.java:697)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.widget.ListView.setAdapter(ListView.java:486)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.app.ListActivity.setListAdapter(ListActivity.java:265)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at com.balabush.pais.XmlActivity.fillData(XmlActivity.java:109)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at com.balabush.pais.XmlActivity$LoadDataTask.doInBackground(XmlActivity.java:23)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-19 21:13:38.535: E/AndroidRuntime(1669):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
03-19 21:13:38.535: E/AndroidRuntime(1669):     ... 4 more
EN

回答 3

Stack Overflow用户

发布于 2012-03-19 04:07:43

下面是完整的代码:

代码语言:javascript
复制
package com.db.share;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.sax.Element;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;
ndroid.widget.SimpleAdapter;

public class XmlActivity extends ListActivity
{
    private class DownloadTask extends AsyncTask<Object, Object, Object>
    {
        @Override
        protected Object doInBackground(final Object... urls)
        {
            fillData();

            return null;
        }

        @Override
        protected void onPostExecute(final Object result)
        {
            closeDialog();
        }

        @Override
        protected void onPreExecute()
        {
            showDialog();
        }
    }
    private NumbersDataSource datasource;

    private ProgressDialog dialog;

    public void fillData()
    {

        datasource = new NumbersDataSource(this);
        datasource.open();

        final List<Number> values = datasource.getAllNumbers();
        datasource.close();

        final ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

        final String xml = XMLfunctions.getXML("http://www.xxxxx.com/products.xml");
        final Document doc = XMLfunctions.XMLfromString(xml);

        final NodeList nodes = doc.getElementsByTagName("item");

        final String temp = "";

        for (int i = 0; i < nodes.getLength(); i++)
        {
            final HashMap<String, String> map = new HashMap<String, String>();

            final Element e = (Element) nodes.item(i);
            map.put("category", XMLfunctions.getValue(e, "category"));
            map.put("title", XMLfunctions.getValue(e, "title"));
            map.put("description", XMLfunctions.getValue(e, "description"));
            map.put("pubDate", XMLfunctions.getValue(e, "pubDate"));
            map.put("link", XMLfunctions.getValue(e, "link"));

        }

        final ListAdapter adapter = new SimpleAdapter(this, mylist, R.layout.xml_row_list, new String[] { "category",
                "title", "description", "pubDate", "link" }, new int[] { R.id.item_category, R.id.item_title,
                R.id.item_description, R.id.item_pubDate, R.id.item_link });

        setListAdapter(adapter);

    }

    @Override
    public void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xml_list);

        new DownloadTask().execute();

    }

    private void closeDialog()
    {
        if (dialog != null)
        {
            dialog.dismiss();
        }
    }

    private void showDialog()
    {
        if (!dialog.isShowing())
        {
            dialog = new ProgressDialog(this);
            dialog.setMessage("Loading. Please wait...");
            dialog.show();

        }

    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-03-19 03:58:10

为了使用AsyncTask

  1. 你只需要在一个方法中调用fillData() onCreate()或者onResume().
  2. You需要做所有的“硬和长的操作”,比如在单独的线程中加载数据
票数 0
EN

Stack Overflow用户

发布于 2012-03-19 04:01:26

根据您的代码,您没有在何处使用异步任务。无论如何,如果您将填充数据() xml解析部分移动到Asynctask的doinbackground(),并在执行它之前调用进度,那么您的进度栏对话框将正常工作。并且它必须调用onPostExecute()中的dismiss()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9761687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档