2017-05-27 67 views
-1

我一直在花费数天时间来实现文件资源管理器。我被困在一个部分。图像加载速度太慢!所以我转向了asynctask。我无法正确更新imageview持有人。 这里是我的代码:如何使用asynctask?

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 




    File file=new File(String.valueOf(filenames[position])); 
    if(file.isDirectory()){ 
     img=R.drawable.folder; 
    } 

    else{ 
     img=getImage(filenames[position]); 
    } 


    ViewHolder viewHolder = null; 
    if (convertView == null) { 
     LayoutInflater inflator = LayoutInflater.from(getContext()); 
     convertView = inflator.inflate(R.layout.list_item, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.tv = (TextView) convertView.findViewById(R.id.textView1); 
     viewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox1); 
     viewHolder.iv= (ImageView)convertView.findViewById(R.id.imageView); 
     viewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       myList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
      } 
     }); 
     convertView.setTag(viewHolder); 
     convertView.setTag(R.id.textView1, viewHolder.tv); 
     convertView.setTag(R.id.checkBox1, viewHolder.cb); 
     convertView.setTag(R.id.checkBox1, viewHolder.iv); 
    } 
    else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    viewHolder.iv.getLayoutParams().height = 80; 
    viewHolder.iv.getLayoutParams().width = 80; 
    viewHolder.cb.setTag(position); 
    final ViewHolder ViewHolder= viewHolder; 

    ViewHolder.tv.setText(myList.get(position).getName()); 
    ViewHolder.cb.setChecked(myList.get(position).isSelected()); 

    Log.v("this","viewHolderMT: "+String.valueOf(viewHolder)+"position: "+position); 

    final View finalConvertView = convertView; 

    class myTask extends AsyncTask<Integer,Bitmap,Bitmap>{ 

     int pos; 
     public myTask(int pos){ 
      this.pos=pos; 
     } 

     @Override 
     protected Bitmap doInBackground(Integer... params) { 
      Bitmap thumb=null; 
      //Log.v("this","position: "+String.valueOf(position)); 

      if((String.valueOf(filenames[pos])).contains(".jpeg")||String.valueOf(filenames[pos]).contains(".jpg")||String.valueOf(filenames[pos]).contains(".png")||String.valueOf(filenames[pos]).contains(".bmp")||String.valueOf(filenames[pos]).contains(".webp")||String.valueOf(filenames[pos]).contains(".gif")){ 
       thumb = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(String.valueOf(filenames[pos])), 64, 64); 
       publishProgress(thumb); 
       Log.v("this","In DIB: "+String.valueOf(thumb)); 
       //Log.v("this","filenameDOI: "+String.valueOf(filenames[pos])+" positionDOI: "+String.valueOf(pos)); 
      } 
      else if((String.valueOf(filenames[pos])).contains(".mp4")||String.valueOf(filenames[pos]).contains(".mkv")||String.valueOf(filenames[pos]).contains(".webm")||String.valueOf(filenames[pos]).contains(".3gp")||String.valueOf(filenames[pos]).contains(".3gpp")){ 
       thumb=ThumbnailUtils.createVideoThumbnail(filenames[pos].getPath(), MediaStore.Video.Thumbnails.MINI_KIND); 
       Log.v("this","In DIB: "+String.valueOf(thumb)); 
       publishProgress(thumb); 

      } 
      return thumb; 
     } 
     @Override 
     protected void onProgressUpdate(Bitmap... thumb){ 
      if(isCancelled()){ 
       return; 
      } 

      ViewHolder v= (ViewHolder)finalConvertView.getTag(); 

      Log.v("this","viewHolderPU: "+String.valueOf(v)+"position: "+pos); 
      if((String.valueOf(filenames[pos])).contains(".jpeg")||String.valueOf(filenames[pos]).contains(".jpg")||String.valueOf(filenames[pos]).contains(".png")||String.valueOf(filenames[pos]).contains(".bmp")||String.valueOf(filenames[pos]).contains(".webp")||String.valueOf(filenames[pos]).contains(".gif")){ 
       //Log.v("this","filenameOPE: "+String.valueOf(filenames[pos])+" positionOPE: "+String.valueOf(pos)); 
       v.iv.setImageBitmap(thumb[0]); 
       Log.v("this","In PU: "+String.valueOf(thumb[0])); 
      } 
      else if((String.valueOf(filenames[pos])).contains(".mp4")||String.valueOf(filenames[pos]).contains(".mkv")||String.valueOf(filenames[pos]).contains(".webm")||String.valueOf(filenames[pos]).contains(".3gp")||String.valueOf(filenames[pos]).contains(".3gpp")){ 

       v.iv.setImageBitmap(thumb[0]); 
      } 
     } 
     @Override 
     protected void onPostExecute(Bitmap thumb){ 



     } 
    } 

    myTask m=new myTask(position); 
    m.execute(); 

    return convertView; 



} 

图像加载到不同imageviews,也imageviews继续在两个滚动,否则新的图像闪烁。我接近解决方案,但不知何故仍然停滞不前。

+0

如果你不知道解决方案,那么就真的没有什么意义了。 –

+0

如果您滚动,listview的项目会被循环/重用。此刻你有一个thumnail,该项目的imageview已被用于differend缩略图。相当标准。许多程序员遇到了这个回收问题。 – greenapps

+0

@greenapps我明白这一点。我有使用setTag的方式。但是,即使我甚至没有scoll也存在问题 –

回答

1

您从的AsyncTask中获得结果。 onProgressUpdate()是用来显示UI等进度条的东西等等。

尝试将您的代码从onProgressUpdate()移至onPostExecute()

+0

试过...实际的问题是与标签。在后执行标签是不匹配的。验证使用日志。 –