2016-04-02 10 views
0

Ich verwendete Recycler-Ansicht, um Bilder aufzulisten, aber es wurde nach dem Zwischenspeichern und allem, was lag. Also entschied ich mich, die Glide-Bibliothek zu verwenden, aber immer noch lückig. Ich dachte schließlich, ich würde es mit nur einem einzigen Zeichen prüfen, und es ist noch immer lückig. Ich verstehe nicht warum. Bitte helfen Sie. Hier ist der Code. Es gibt noch nicht viel Code. Sie können den Code, den ich für meine Bildanzeige verwendet habe, auskommentiert sehen.Laggy Recycler Ansehen ohne Code?

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageHolder> 
{ 
private File file; 
private String logging=getClass().getSimpleName(); 
private int size; 
private MemCache memCache; 
private Context context; 
private Bitmap bitmap; 
public ImageAdapter(File file,int Size,MemCache memCache,Context context) 
{ 
    this.file = file; 
    size=Size; 
    this.memCache=memCache; 
    this.context=context; 
    bitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.empty_photo); 
} 


@Override 
public ImageHolder onCreateViewHolder(ViewGroup parent, int viewType) 
{ 
    return new ImageHolder(new ImageView(context),size); 
} 

@Override 
public void onBindViewHolder(ImageHolder holder, int position) 
{ 
    Glide.with(context).load(R.drawable.empty_photo).into(holder.getImageView()); 
//  if (memCache.get(file.listFiles()[position].toString())!=null) 
//  { 
//   holder.getImageView().setImageBitmap(memCache.get(file.listFiles()[position].toString())); 
//  } 
//  else 
//  { 
//   ImageSyncTask imageSyncTask = new ImageSyncTask(size, holder.getImageView(),memCache); 
//   imageSyncTask.executeOnExecutor(imageSyncTask.THREAD_POOL_EXECUTOR, file.listFiles()[position]); 
//  } 
//  Glide.with(context).load(file.listFiles()[position]).crossFade().into(holder.getImageView()); 
} 
@Override 
public int getItemCount() 
{ 
    if (file!=null&&file.listFiles()!=null) return file.listFiles().length; 
    else return 0; 
} 













public static class ImageHolder extends RecyclerView.ViewHolder 
{ 
    private ImageView imageView; 
    public ImageHolder(View itemView,int size) 
    { 
     super(itemView); 
     imageView=(ImageView)itemView; 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setMinimumWidth(size); 
     imageView.setMinimumHeight(size); 
    } 
    public ImageView getImageView() 
    { 
     return imageView; 
    } 
    public void clearImage() 
    { 
     imageView.setImageResource(android.R.color.transparent); 
    } 


} 

}

Ich weiß, es ist ein Laden Bitmap aber immer noch seine nur eine. Das sollte nicht so viel Verzögerung machen. Und ja, ich habe die typische setImageBitmap anstelle von Glide benutzt, aber immer noch laggy. Es gibt den Ansichtshalter. Nur einfache Funktion. Und ich habe vorher ein richtiges Layout dafür verwendet, aber es hat nicht so gut funktioniert. In diesem habe ich gerade New ImageView() und setParamaters verwendet, nur um sicherzustellen, dass es ein Problem im Layout gab.

Bitte Hilfe. Ich verstehe nicht, warum der typische Adapter Lag erzeugt.

Original-MainActivity

public class MainActivity extends AppCompatActivity 
{ 
RecyclerView recyclerView; 
int cnum; 
private MemCache memCache; 
private String logging=getClass().getSimpleName(); 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    DisplayMetrics displayMetrics=new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
    int maxmem=(int)Runtime.getRuntime().maxMemory()/1024; 
    int cache_mem=maxmem/10; 
    memCache=new MemCache(cache_mem); 
    int orientation=getResources().getConfiguration().orientation; 
    if (orientation== Configuration.ORIENTATION_PORTRAIT) 
    cnum=3; 
    else cnum=5; 
    recyclerView=(RecyclerView)findViewById(R.id.recycler_view); 
    recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(),cnum)); 
    recyclerView.setAdapter(new ImageAdapter(getGallery(),displayMetrics.widthPixels/cnum,memCache,getApplicationContext())); 
} 

private File getGallery() 
{ 
    return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath(),"Trial"); 
} 

}

Ich habe auch versucht, und maximal Anrufe entfernt, die entfernt werden können, um sicherzustellen, dass es auf UI-Thread nicht viel Aufgabe.

+0

Bitte geben Sie den Quellcode als Text und nicht als Bilder ein. Nutzen Sie darüber hinaus die Methodenverfolgung, um genau zu bestimmen, wo Sie Ihre Zeit verbringen. – CommonsWare

+0

Ich habe Methodenverfolgung verwendet, aber ich konnte es nicht verstehen. Ich bin Anfänger darin. Und warten Sie, ich bearbeite mit Originalcode –

+0

den Hauptcode aktualisiert. Und ich habe SysTrace verwendet, und es heißt, dass die Bindung des Viewholders zu viel Zeit in Anspruch nimmt. Aber ich weiß nicht, dass es auch so viel Zeit in Anspruch nimmt, wenn es nur ein einziger Code mit nicht so viel Aufwand ist. –

Antwort

1

Das Ausführen von Datenträger-E/A im Hauptanwendungs-Thread ist eine häufige Quelle für "Jank", da E/A möglicherweise etwas Zeit in Anspruch nimmt. StrictMode kann Ihnen helfen, festzustellen, wo Sie Datenträger-E/A im Hauptanwendungs-Thread ausführen.

Im Allgemeinen möchten Sie Ihre Modelldaten (z. B. eine Liste von Dateien) in einem Hintergrundthread laden und dann von der speicherinternen Darstellung dieser Modelldaten im Hauptanwendungsthread abarbeiten.