Dialog在Async Task android上冻结

时间:2011-12-11 23:10:16

标签: android asynchronous dialog task freeze

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

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

第二名:与上面相同,但我在onProgressUpdate()上添加了每一张图片

第3名:使用处理程序和线程

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

我一直试图解决这个问题很长一段时间但还没有。有任何想法吗?这是我的代码的一部分:

     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) {
                  //...
              }               
        });
    }

1 个答案:

答案 0 :(得分:2)

im.setImageBitmap(getRemoteImage(imageUrl));

如果getRemoteImage()执行了它的名称和参数建议(从网上下载图像),那么这一行就是你的问题,因为它是在onProgressUpdate()中执行的。< / p>

onProgressUpdate()在UI线程中运行而不是在后台线程中运行,它应该在进度发生变化时执行UI工作。在此处下载图像时,会阻止UI线程,以便完成下载图像所需的时间。由于您遍历所有图像,它将保留您的UI线程,直到您下载所有图像。

而是在doInBackground() 中运行下载(您在方法顶部的评论表明您已经这样做了)并将下载的图片通过以下内容传递到onProgressUpdate publishProgress()采用的论点。