【发布时间】:2014-02-15 13:37:51
【问题描述】:
根据用户输入,我动态地将许多文本视图添加到循环中的相对布局中。
问题在于,随着电视数量的增加,构建布局所需的时间也会增加,以至于用户将收到“等待/强制关闭”消息。
由于位于主 UI 线程上,我知道这一点,但据我所知,我无法将视图异步添加到布局中,例如在 doInBackground 中,当您得到“只有创建视图层次结构的原始线程才能触及其视图”时错误。
每个新电视都在前一个电视的右侧或下方,在循环中计算,因此我无法将 addview 语句移动到 AsyncTask onPostExecute。
有没有办法在使用 AsyncTask 时在 for 循环中将电视添加到布局中?
这是需要这样做的:
public class LoadData extends AsyncTask<Void, Void, Void> {
protected void onPreExecute(){ ....
protected Void doInBackground(Void... params){ ...
while (yCoord + CellSizeH < b2.getHeight()) {
while (xCoord + CellSizeW < b2.getWidth() ) {
tv = new TextView(this);
tv.setTextSize(DisplayCellSizeH * 0.5f);
tv.setWidth(DisplayCellSizeW);
tv.setHeight(DisplayCellSizeH);
tv.setOnClickListener(new View.OnClickListener() {...
}
//this will error so needs to be in onPostExecute
thelayout.addView(tv, params1);
}
}
protected void onPostExecute(Void result){ ...
希望这是有道理的。谢谢
【问题讨论】:
-
你不应该从差异线程访问视图
-
使用 Traceview 确定您的时间都花在了哪里。在遇到 ANR 之前,您应该已经用完了堆空间,这表明您在主应用程序线程上做了一些错误的工作。
标签: android android-layout android-asynctask