AsyncTask结果与常规函数不同

时间:2011-10-05 13:44:31

标签: android android-asynctask

我有一个接收滑动手势的视图。 这应该触发主活动的创建和setContentView(布局)。 (视图位于主要活动的布局内)

当我尝试在asynctask中执行此操作时,它会遗漏所有布局图像? 好像尚未完成。 我不太了解一些东西。

来自 view.java

的部分代码
Main.mHandler.post(new Runnable()
                    { 
                        public void run()
                        {
                            new Main.GetNavigationLayout().execute(url);
                    }
                    });

url是我用来创建新布局的.xml文件的位置。

GetNavigationLayout是AsyncTask

代码是Main.java中的AsyncTask:

public static class GetNavigationLayout extends AsyncTask<String, Void, CustomLayout> {
    boolean isDone = false; 
     @Override
        protected EvadoLayout doInBackground(String... url)
        {
            CustomLayout layout = new CustomLayout(Main);
                Looper.prepare();       
                try 
                {

                    String newpage = url[0];
                    Document doc = XmlImporter.GetNewPlayer(newpage);

                    if (doc == null)
                    {
                        layout = null; 
                    }       

                    layout.LoadXml(doc);  // cause drawing of objects etc. 



                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

                isDone = true;
                //Looper.loop();   // causes it to never return...
            return layout;

        }

        @Override
        protected void onPostExecute(CustomLayout layout)
        {
            if (isDone)
              Main.setContentView(layout);
        }
 }

现在这显示了除了图像之外的每一个,而如果我在没有AsyncTask的情况下运行它,它会在布局中显示所有内容。 我错过了什么?

2 个答案:

答案 0 :(得分:2)

  layout.LoadXml(doc);  // cause drawing of objects etc. 

我估计你在这里画画了吗?我认为这是问题所在。试图从AsyncTask的doInBackground()中绘制是错误的,因为它不是UI线程。您应该在UI线程中运行的onPostExecute()中进行绘图

答案 1 :(得分:1)

您可以在onProgressUpdate()中发布到用户界面。使用此方法将允许您保留在doInBackground内部并在获得布局时将更新发布到UI并继续在doInBackground中。使用publishProgress()将信息从doInBackground发送到UI线程。