添加嵌套视图会动态冻结App

时间:2014-11-12 13:47:29

标签: java android multithreading runnable

我正在构建应用程序,它会动态生成和添加视图。我不知道我需要创建哪些视图,这些视图可以是嵌套布局或简单标签等,具体取决于从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不太熟悉,已经尝试解决这个问题几天了。请帮忙。

1 个答案:

答案 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();