Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 添加嵌套视图会动态冻结应用程序_Java_Android_Multithreading_Runnable - Fatal编程技术网

Java 添加嵌套视图会动态冻结应用程序

Java 添加嵌套视图会动态冻结应用程序,java,android,multithreading,runnable,Java,Android,Multithreading,Runnable,我正在构建应用程序,它可以动态生成和添加视图。我事先不知道需要创建什么视图,这些视图可以是嵌套的布局或简单的标签等,这取决于web服务返回的内容 到目前为止,一切都很顺利,直到我开始构建真正复杂的嵌套布局。我有一个案例,需要动态添加大约11个层次的布局。当活动开始时,我显示ProgressDialog(环),同时生成视图。我的问题是,在添加视图时,这个复杂结构的ProgressDialog会冻结。这是创建视图的代码: private class ViewCreator implements Ru

我正在构建应用程序,它可以动态生成和添加视图。我事先不知道需要创建什么视图,这些视图可以是嵌套的布局或简单的标签等,这取决于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
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();