我有一个接收滑动手势的视图。 这应该触发主活动的创建和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的情况下运行它,它会在布局中显示所有内容。 我错过了什么?
答案 0 :(得分:2)
layout.LoadXml(doc); // cause drawing of objects etc.
我估计你在这里画画了吗?我认为这是问题所在。试图从AsyncTask的doInBackground()
中绘制是错误的,因为它不是UI线程。您应该在UI线程中运行的onPostExecute()
中进行绘图
答案 1 :(得分:1)
您可以在onProgressUpdate()中发布到用户界面。使用此方法将允许您保留在doInBackground内部并在获得布局时将更新发布到UI并继续在doInBackground中。使用publishProgress()将信息从doInBackground发送到UI线程。