AsyncTask类解析XML

时间:2011-09-13 10:43:52

标签: android xml android-asynctask

当我在UI线程中使用它但希望将其移动到AsyncTask类时,此代码有效。我刚刚读完了如何做到这一点,但是当我运行应用程序时,它现在在开始阅读课程时崩溃。

该类在将XML文件加载到List之前调用并解析它们。这是我的第一个Android应用程序,因此您可以提供任何帮助。

由于

public class DownloadXml extends AsyncTask<String, Void, String>
{       
    private ProgressDialog pd;
    protected String doInBackground(String... platform) 
    {
        pd = ProgressDialog.show(CategoryData.this, "Please Wait...", "Loading games");

        try
        {
            BaseFeedParser parser = new BaseFeedParser();
            messages = parser.parse();
        }
        catch (Throwable t)
        {
            Log.e("RetailApp",t.getMessage(),t);
        }
        return rowPlatform;
    }


    protected void onPostExecute(String rowPlatform)
    {
        productList = new ArrayList<HashMap<String, Object>>();

            for (Message msg : messages)
            {   
                if(msg.getPlatform().compareTo(rowPlatform) == 0 )
                {   
                    HashMap<String, Object> map = new HashMap<String, Object>();
                    map.put("Title", msg.getTitle());
                    map.put("Brand", msg.getBrand());
                    map.put("Price", "$" + msg.getPrice());

                    try
                    {
                        String picture[] = msg.getImage().split("-large.jpg");
                        URL pictureURL = new URL(picture[0] + "-medium.jpg");
                        Bitmap bitmap = BitmapFactory.decodeStream(pictureURL.openStream());
                        map.put("Img",bitmap);
                    }
                catch (Throwable t)
                {
                    Log.e("RetailApp",t.getMessage(),t);
                }
                productList.add(map);
                } 
            }

编辑:我已将'for'循环移动到onPostExecute,这似乎改进了代码,但我仍然收到'未注册的句柄仍然被锁定'错误。有什么想法吗?

感谢Rob的想法,但没有运气,已经从背景中移除了循环和Toast ......上面的新代码。我收到错误“Uncaught handler:thread AsycTask#1因未捕获的异常而退出”

2 个答案:

答案 0 :(得分:1)

使用您的LogCat。 AndroidRuntime日志将为您提供完整的堆栈跟踪和强类型异常,它将向您显示崩溃的确切原因。

我很确定你正在尝试从后台线程中显示ProgressDialog。您应该在执行AsyncTask之前在UI线程上执行此操作。您可以在onPostExecute中将其关闭,因为它会在UI线程上运行

答案 1 :(得分:0)

pd = ProgressDialog.show(CategoryData.this, "Please Wait...", "Loading games");

进入onPreExecute(),在执行开始之前在UI线程上调用。