添加嵌套视图动态冻结应用程序
Posted
技术标签:
【中文标题】添加嵌套视图动态冻结应用程序【英文标题】:Adding nested views dynamically freezes the App 【发布时间】: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。您还有什么可以建议的吗?
【参考方案1】:
您可以使用 AsyncTask 来执行此操作/这是一个示例:
private class GenerateViews extends AsyncTask<Void,Void,Void>
@Override
protected void onPreExecute()
// SHOW THE SPINNER WHILE GENERATING VIEWS
spinner.setVisibility(View.VISIBLE);
@Override
protected Void doInBackground(Void... params)
//CALL YOUR VIEW GENERATING METHOD HERE
return null;
@Override
protected void onPostExecute(Void result)
spinner.setVisibility(View.INVISIBLE);
如果你愿意,你可以在你的班级里创建这个班级。然后,你只需调用
new GenerateCalls.execute();
【讨论】:
我已经试过了,谢谢。它阻塞线程比我现在拥有的更糟糕。 这很奇怪..好吧,如果您找到了解决问题的方法,请在此处发布您的答案。我想知道:)以上是关于添加嵌套视图动态冻结应用程序的主要内容,如果未能解决你的问题,请参考以下文章
在滚动视图中动态隐藏状态栏时滞后/屏幕冻结(Swift 3)
Ember JS 过渡到嵌套路由,其中所有路由都是视图中的动态段