java - 添加嵌套 View 会动态卡住应用程序

标签 java android multithreading runnable

我正在构建应用程序,它动态生成并添加 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/

相关文章:

java - 我该如何修复 'android.os.NetworkOnMainThreadException' ?

python线程队列生产者消费者线程安全

c++ - 在 QThread::run 中间调用一个槽

java - 如何使 TextView 中的每一行都可选

java - 将 JApplet 添加到 JPanel

java - 基于控制台的 key 监听器 Java

java - 使用 android.gms.drive 从 android 中删除/垃圾文件

java - SQL异常 : Can't create table errno 150/foreign key

经典和 BTLE 设备的 Android 蓝牙扫描

c# - 在.NET 中快速检查或限制线程内存使用?