我正在构建应用程序,它会动态生成和添加视图。我不知道我需要创建哪些视图,这些视图可以是嵌套布局或简单标签等,具体取决于从Web服务返回的内容。
到目前为止,一切都很顺利,直到我开始构建非常复杂的嵌套布局。我有一个案例需要动态添加大约11级布局。活动开始时,我会显示ProgressDialog(响铃),同时生成视图。我的问题是,使用这个复杂的结构,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
我对Threads不太熟悉,已经尝试解决这个问题几天了。请帮忙。
答案 0 :(得分:0)
您可以使用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();