2011-10-05 84 views
1

我有一个接收滑动手势的视图。 这应该触发主活动的创建和setContentView(布局)。 (视图在主要活动的布局内)AsyncTask结果与常规功能不同

当我试图在一个异步的内部做到这一点,它留下了所有的布局图像?好像它还没有完成。 有很多东西我不完全理解。

这从view.java

Main.mHandler.post(new Runnable() 
        { 
         public void run() 
         { 
          new Main.GetNavigationLayout().execute(url); 
        } 
        }); 

的URL部分代码是我用它来创建一个新的布局的.xml文件的位置。

GetNavigationLayout是的AsyncTask

代码是在的AsyncTask Main.java:

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); 
     } 
} 

现在这说明除了图像everythig,而如果我运行这个没有的AsyncTask它会显示在布局的一切。 我在想什么?

回答

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

我想你是在这里画的图像?我认为这是问题。试图从AsyncTask的doInBackground()中绘制是错误的,因为它不是UI线程。您应该执行在UI线程中运行的中的绘图

+0

This Works。谢谢。 这是坏的它的作品,虽然,我一直在寻找一种方式来绘制多个布局在同一时间。 (因此异步)。 我想我会需要一些更多的测试。 谢谢! 然后将它们添加到swipeView。 – ron

+0

经过一番测试后,它看起来像我遇到了一个新问题; 10-05 16:32:28.730:错误/ AndroidRuntime(2024):引起:java.lang.RuntimeException:每个线程只能创建一个Looper。 据我可以告诉我没有宣布更多loopers? 如果我删除Looper.prepare(); AsyncTask会崩溃... – ron

1

您可以发布到onProgressUpdate()的UI中。使用此方法将允许您留在doInBackground中,并在获取布局并在doInBackground内继续时向UI发布更新。使用publishProgress()将信息从doInBackground发送到UI线程。

+0

谢谢你! 一旦我发现这个活套错误,我会立即尝试。 “ ”每个线程只能创建一个Looper“:\ – ron

+0

您可以移除不需要的弯针部分。只有在您尝试从不同的线程进行ui更改时才需要循环方法。如果要在onProgressUpdate中进行ui更改,可以删除活套零件。 – Bobbake4

+0

好的,所以我试着去做你所说的,发布到onProgressUpdate()中的UI。这工作正常! 但是我似乎无法摆脱活套。 “无法在未调用Looper.prepare()”错误的线程内创建处理程序。 当我检查调试器时,我发现我的AsyncTask在使用后不会被破坏?完成后有没有办法让我失去线程? – ron