Android 对话框冻结在异步任务上

Android 对话框冻结在异步任务上,android,asynchronous,dialog,task,freeze,Android,Asynchronous,Dialog,Task,Freeze,在我的活动中,我下载了几个图像,然后通过在主布局中添加每个图像来显示它们。我尝试了这3种方法,但每次我的进度对话框都会冻结,直到加载图像: 第一种方法:使用异步任务:我在doInBackground()上下载图像,并将它们添加到主布局onPostExecute() 第二:与上面相同,但我在ProgressUpdate()上添加了每个图像 第三:使用处理程序和线程 每次进度对话框冻结几秒钟(实际上整个应用程序都会冻结),直到图像下载并显示在屏幕上 我已经尝试解决这个问题很长时间了,但什么都没有。有

在我的活动中,我下载了几个图像,然后通过在主布局中添加每个图像来显示它们。我尝试了这3种方法,但每次我的进度对话框都会冻结,直到加载图像:

第一种方法:使用异步任务:我在doInBackground()上下载图像,并将它们添加到主布局onPostExecute()

第二:与上面相同,但我在ProgressUpdate()上添加了每个图像

第三:使用处理程序和线程

每次进度对话框冻结几秒钟(实际上整个应用程序都会冻结),直到图像下载并显示在屏幕上

我已经尝试解决这个问题很长时间了,但什么都没有。有什么想法吗?以下是我代码的一部分:

     protected Integer doInBackground(Void... params) {         
        //...
            try {
                //download images
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            if (!loadTask.isCancelled()) {                  
                //Display images        
                int length=imageList.size();        

                for (i=0; i<length; i++) {                      
                    publishProgress(i);                     
                }
            }               

        return 1;                       
    }

  protected void onProgressUpdate(Integer... a) {
        //interaction with UI thread
        int i = a[0];
        ImageView im = new ImageView (MyActivity.this);
        im.setImageBitmap(getRemoteImage(imageUrl));
        im.setLayoutParams(Params);
        im.setAdjustViewBounds(true);
        im.setPadding(px2, px2, px2, px2);
        im.setOnClickListener(new OnClickListener() {
              public void onClick(View v) {
                  //...
              }               
        });
    }
受保护整数doInBackground(Void…params){
//...
试一试{
//下载图像
}
}捕获(JSONException e){
e、 printStackTrace();
}
如果(!loadTask.isCancelled()){
//显示图像
int length=imageList.size();
对于(i=0;i
如果
getRemoteImage()
按照名称和参数的建议(从web下载图像),那么这一行就是您的问题,因为它是在
onProgressUpdate()
中执行的

onProgressUpdate()
在UI线程中运行,而不是在后台线程中运行。当进度发生变化时,它应该执行UI工作。当您在此处下载图像时,您会在一段时间内阻止UI线程完成图像下载。由于您循环所有图像,因此它将保留UI线程,直到所有图像下载完毕


而是在
doInBackground()
中运行下载(您在方法顶部的注释表明您已经这样做了),并通过
publishProgress()
接受的参数将下载的图像传递给
onProgressUpdate

您如何执行异步任务?loadTask=new LoadingTask();loadTask.execute();的确,这就是问题所在!我想你不应该在ProgressUpdate()上做任何计算,而应该只是更新布局。谢谢,伙计!
im.setImageBitmap(getRemoteImage(imageUrl));