Java 添加嵌套视图会动态冻结应用程序
我正在构建应用程序,它可以动态生成和添加视图。我事先不知道需要创建什么视图,这些视图可以是嵌套的布局或简单的标签等,这取决于web服务返回的内容 到目前为止,一切都很顺利,直到我开始构建真正复杂的嵌套布局。我有一个案例,需要动态添加大约11个层次的布局。当活动开始时,我显示ProgressDialog(环),同时生成视图。我的问题是,在添加视图时,这个复杂结构的ProgressDialog会冻结。这是创建视图的代码:Java 添加嵌套视图会动态冻结应用程序,java,android,multithreading,runnable,Java,Android,Multithreading,Runnable,我正在构建应用程序,它可以动态生成和添加视图。我事先不知道需要创建什么视图,这些视图可以是嵌套的布局或简单的标签等,这取决于web服务返回的内容 到目前为止,一切都很顺利,直到我开始构建真正复杂的嵌套布局。我有一个案例,需要动态添加大约11个层次的布局。当活动开始时,我显示ProgressDialog(环),同时生成视图。我的问题是,在添加视图时,这个复杂结构的ProgressDialog会冻结。这是创建视图的代码: private class ViewCreator implements Ru
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
call,但这会在生成视图层次结构时完全阻塞UI线程。同时,view.post
不会被立即调用,因此我已经按照中的建议对视图进行了一些更改。因此,现在添加了视图,但ProgressDialog运行不平稳。它会在一些情况下停止,然后恢复。我也尝试过使用安卓AsyncTask
,但这与runOnUiThread
我不是很有经验的线程,已经试图解决这几天了。请提供帮助。您可以使用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);
}
}
我对线程不是很有经验
@Selvin:谢谢,我已经尝试使用StrictMode,似乎没有任何违反策略的行为。当前正在尝试使用此:。你还有什么建议吗?我已经试过用了,谢谢。它阻塞线程的情况甚至比我现在遇到的更糟。这很奇怪。好吧,如果你找到了一种方法,请在这里发布你的答案。我想知道:)
new GenerateCalls.execute();