2011-12-11 99 views
0

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

1的方法:使用异步任务:我下载的doInBackground(图像),并把它们添加到主布局onPostExecute()

第二:与上面相同,但我加3的图像的每一个onProgressUpdate()

:使用一个处理器和一个线程

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

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

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

你是如何执行AsyncTask的? – dmon

+0

loadTask = new LoadingTask(); loadTask.execute(); – MScott

回答

2
im.setImageBitmap(getRemoteImage(imageUrl)); 

如果getRemoteImage()做什么它的名字和参数表明(从网络上下载的图像),那么这条线是你的问题,因为它在onProgressUpdate()真实执行。

onProgressUpdate()在UI线程中运行而不在后台线程中,它应该在进程更改时执行UI工作。当你在这里下载你的图像时,你会阻止UI线程下载图像完成所花费的时间。由于您遍历了所有图像,它将保留您的UI线程,直到您下载了所有图像。

而是运行下载的doInBackground()(在方法的顶部您的评论表明您已经这样做)并经由publishProgress()采取论证到onProgressUpdate通过下载的图像。

+0

的确是这个问题!我猜你不应该对onProgressUpdate()进行任何计算,除了更新布局。谢了哥们! – MScott