添加多个视图会冻结ProgressDialog

时间:2012-03-08 22:32:52

标签: android

我想以编程方式显示ProgressDialog,它会为布局添加多个视图。 我在主Activity上声明了一个ProgressDialog,然后启动了一个AsyncTask来添加多个视图。在AsyncTask的onPostExecute上,ProgressDialog被解除。该应用程序工作,但问题是启动缓慢,ProgressDialog暂时冻结。 这是AsyncTask的主要循环。列扩展了LinearLayout。

for(int i=0;i<7;i++){                   
    ((LinearLayout) Global.a.findViewById(R.id.scrollLayout)).addView(new Column(Global.a,i));                  
}

2 个答案:

答案 0 :(得分:3)

根据您的代码段,您似乎错误地使用了AsyncTask。

for(int i=0;i<7;i++){

    ((LinearLayout) Global.a.findViewById(R.id.scrollLayout)).addView(new Column(Global.a,i));                  
}

这绝不应该在AysncTask中完成。如果它完成了doInBackground,那么你正在从另一个线程修改UI,如果它在其他任何地方完成(onPreExecute(),onPostExecute()或onProgressUpdate(),那么你在UI线程中运行for循环。

最好的解决方案是创建一个xml文件,其中包含您要添加到其中的视图。虽然如果您打算在AsyncTask中添加视图,那么您需要更改其完成方式。

private SomeName extends AsyncTask<Void,Column,Void>{
    private Linearlayout layout;

    protected void onPreExecute(Void... unused){
        //UI thread
        //show dialog
        layout = (LinearLayout) Global.a.findViewById(R.id.scrollLayout);
    }
    protected void doInBackground(Void... unused){
        //Background thread
        for(int i=0;i<7;i++){
            //create the view in the background
            Column column = new Column(Global.a,i);
            //call publish progress to update the UI                  
            publishProgress(column);
        }
    }

    protected void onProgressUpdate(Column... column){
        //UI thread
        //Update the UI
        layout.addView(column[0]);
    }

    protected void onPreExecute(Void... unused){
        //UI thread
        //dismiss dialog
    }
}

答案 1 :(得分:0)

由于您没有发布任何代码,我只能建议让您的progressDialog成为AsyncDialog的一部分并将您的ProgressDialog.show放入AsyncTask的onPreExecute