【发布时间】:2015-01-09 09:30:24
【问题描述】:
我正在构建应用程序,它会动态生成和添加视图。我事先不知道我需要创建哪些视图,这些可以是嵌套布局或简单标签等,具体取决于从 Web 服务返回的内容。
到目前为止一切都很好,直到我开始构建非常复杂的嵌套布局。我有一个案例需要动态添加大约 11 级布局。当活动开始时,我显示 ProgressDialog(ring),同时正在生成视图。我的问题是,在添加视图时,这种复杂的结构 ProgressDialog 会冻结。这是创建视图的代码:
private class ViewCreator implements Runnable {
public BackgroundTaskViewCreatedResponse delegate;
private View mCreatedView;
private ComponentDefinition mComponent;
private ViewCreator(ComponentDefinition component){
this.mComponent = component;
}
@Override
public void run() {
try {
if (mComponent != null){
mComponent.setLinkedData(model.getLinkedData());
mCreatedView = componentCreator.createComponent(mComponent);
}
} finally {
if (mCreatedView != null)
delegate.processFinishTask(mCreatedView);
}
}
}
布局,里面有其他视图,实现BackgroundTaskViewCreatedResponse,所以,当视图准备好时,它会被添加:
@Override
public void processFinishTask(final View createdView) {
//((Activity)view.getContext()).runOnUiThread(new Runnable(){
mView.post(new Runnable(){
@Override
public void run() {
mView.addView(createdView);
}
});
}
正如您在上面看到的,我尝试调用 runOnUiThread 调用,但这会在生成视图层次结构时完全阻塞 UI 线程。同时view.post 并没有被直接调用,所以我按照this SO answer 中的建议对视图进行了一些更改。所以,现在我的视图被添加了,但是我的 ProgressDialog 运行不顺畅。它会在几次停止然后恢复。我也尝试过使用 Android AsyncTask,但效果与 runOnUiThread 相同
我对线程不是很有经验,几天来一直在尝试解决这个问题。请帮忙。
【问题讨论】:
-
I am not very experienced with Threads -
@Selvin:谢谢,我已经尝试过使用 StrictMode 并且似乎没有任何违反政策的行为。目前正在尝试使用这个:developer.android.com/tools/debugging/debugging-tracing.html。您还有什么可以建议的吗?
标签: java android multithreading runnable