2017-05-27 72 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

試過...實際的問題是與標籤。在後執行標籤是不匹配的。驗證使用日誌。 –