2017-05-27 4 views
-1

Ich habe Tage damit verbracht, einen Datei-Explorer zu implementieren. Ich stecke nur an einem Teil fest. Bilder werden zu langsam geladen! Also bin ich zu asynctask umgezogen. Ich kann den Bildbetrachtungsinhaber nicht korrekt aktualisieren. Hier ist mein Code:Wie genau asynctask verwenden?

@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; 



} 

Bilder auf verschiedene imageviews laden, auch die imageviews halten auf mit neuen Bildern auf beiden Scrollen und sonst zu blinken. Ich bin so nah an der Lösung, aber irgendwie immer noch fest.

+0

Und es hat wirklich keinen Sinn, die Frage zu verwerfen, wenn Sie die Lösung nicht kennen. –

+0

Die Elemente der Listenansicht werden beim Scrollen wiederverwendet/wiederverwendet. In dem Moment, in dem Sie ein Thumnail haben, wird die Bildansicht dieses Elements bereits für ein anderes Thumbnail verwendet. Ziemlich Standard. Tonnen von Programmierern sind auf dieses Recyclingproblem gestoßen. – greenapps

+0

@greenapps Ich verstehe das. Und ich habe das mit setTag angegangen. Aber das Problem besteht auch, wenn ich nicht mal scroll –

Antwort

1

Sie erhalten Ergebnis von AsyncTask in onPostExecute(). Die onProgressUpdate() ist für Dinge wie Fortschrittsbalken auf der Benutzeroberfläche und solche Dinge angezeigt.

Versuchen Sie, Ihren Code von onProgressUpdate() zu onPostExecute() zu verschieben.

+0

Versucht, dass ... Das eigentliche Problem ist mit dem Tag. In post execute Tags stimmen nicht überein. Bestätigt das mit dem Protokoll. –