我正在构建应用程序,它动态生成并添加 View 。我事先不知道需要创建什么 View ,这些 View 可以是嵌套布局或简单标签等,具体取决于从 Web 服务返回的内容。
到目前为止一切都很顺利,直到我开始构建非常复杂的嵌套布局。我有一种情况需要动态添加大约 11 层布局。当 Activity 开始时,我会显示 ProgressDialog(ring),同时生成 View 。我的问题是,使用这种复杂的结构,ProgressDialog 在添加 View 时会卡住。这是创建 View 的代码:
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);
}
}
}
其中包含其他 View 的布局实现了BackgroundTaskViewCreatedResponse
,因此,当 View 准备好时,它将被添加:
@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
调用,但这会在生成 View 层次结构时完全阻塞 UI 线程。同时 view.post
不会立即被调用,因此我按照 this SO answer 中的建议对 View 进行了一些更改。 。所以,现在我的 View 已添加,但我的 ProgressDialog 运行不顺畅。它偶尔会停止,然后又恢复。我也尝试过使用 Android 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);
}
}
如果您愿意,您可以在您的类(class)中创建此类。然后,你只需调用
new GenerateCalls.execute();
关于java - 添加嵌套 View 会动态卡住应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26888513/