Lazy Loading funktioniert nicht richtig

Ich zeige eine Liste von Kontakten in einem recyclerview. Ich zeige Kontaktprofilbilder, zuerst lade ich diese Bilder vom Server und speichere diese Bilder dann in einem externen Speicher.

Dann Laden der Bilder aus externem Speicher. Ich kann die geladenen Bilder sehen, aber da ich rolle, kann ich einige Bilder für eine Sekunde oder zwei sehen, dann verschwinden sie und ich sehe das Standardbildsymbol.

  • Wie bekomme ich ein Fragment, um sich selbst zu entfernen, dh sein Äquivalent von finish ()?
  • Kann ich einen vektor zeichnen, der auf die gleiche Weise verwendet wird, wie ich einen 9 Patch benutzt habe?
  • Hybrid vs Native Mobile App
  • MediaPlayer kann keine Audiodateien aus dem Programmdatenordner abspielen?
  • Android-Symbolleiste Hinzufügen von Menüpunkten für verschiedene Fragmente
  • Environment.getExternalStorageDirectory gibt den Pfad nicht an den Wechseldatenträger zurück
  • public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactHolder> { private List<Contact> contactList; File myDir1; private Activity mContext; private Boolean fileExists; private File file; private static final int MY_PERMISSIONS_REQUEST_CALL= 20; public ContactAdapter(Activity context, List<Contact> contactList) { this.contactList = contactList; this.mContext = context; } @Override public ContactHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout,null); ContactHolder mh = new ContactHolder(v); return mh; } @Override public void onBindViewHolder(final ContactHolder contactHolder, int i) { final Contact contact = contactList.get(i); // Log.e("Imagename",""+"http://xesoftwares.co.in/contactsapi/profile_images/85368a5bbd6cffba8a3aa202a80563a2.jpg");//+feedItem.getThumbnail()); Target target = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // your code here ... bitmap = Bitmap.createScaledBitmap(bitmap,(int)(bitmap.getWidth()*0.8), (int)(bitmap.getHeight()*0.8), true); contactHolder.thumbnail.setImageBitmap(bitmap); Log.e("ProfileImage", contact.getmProfileImage()); SaveImages(bitmap, contact.getmProfileImage()); } @Override public void onBitmapFailed(Drawable errorDrawable) { contactHolder.thumbnail.setImageDrawable(errorDrawable); // do error handling as required } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { contactHolder.thumbnail.setImageDrawable(placeHolderDrawable); } }; contactHolder.thumbnail.setTag(target); String url = ServiceUrl.getBaseUrl() + ServiceUrl.getImageUserUrl() + contact.getmProfileImage(); Log.e("url",url); if(contact.getmProfileImage().equals("")) { file = new File(""); fileExists = file.exists(); contactHolder.thumbnail.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.ic_account_circle_black_48dp)); } else { file = new File(Environment.getExternalStorageDirectory() + "/ContactProfileImages/" + contact.getmProfileImage()); fileExists = file.exists(); } if(fileExists) { Log.e("fileExists",file.getAbsolutePath()); BitmapFactory.Options bmOptions = new BitmapFactory.Options(); Bitmap bitmap = BitmapFactory.decodeFile(file.getPath(), bmOptions); contactHolder.thumbnail.setImageBitmap(bitmap); } else { Log.e("Picasso",file.getAbsolutePath()); Picasso.with(mContext).load(url) .error(R.drawable.ic_account_circle_black_24dp) .placeholder(R.drawable.ic_account_circle_black_24dp) .into(target); } contactHolder.title.setText(contact.getmUserName()); //feedListRowHolder.genre.setText(Html.fromHtml(feedItem.getGenre())); } @Override public int getItemCount() { return (null != contactList ? contactList.size() : 0); } public void SaveImages(Bitmap bitmap,String profileName) { try { String root = Environment.getExternalStorageDirectory().getPath(); File myDir = new File(root +"/ContactProfileImages"); if (!myDir.exists()) { myDir.mkdirs(); } // String name = new Date().toString();= String name = profileName; File myDir1 = new File(myDir, name); if(!myDir1.exists()) { FileOutputStream out = new FileOutputStream(myDir1); bitmap.compress(Bitmap.CompressFormat.PNG,100,out); out.flush(); out.close(); } } catch(Exception e){ // some action } //myDir1= imageFilePath1.getprofile(); } public class ContactHolder extends RecyclerView.ViewHolder implements View.OnClickListener { protected CircleImageView thumbnail; protected TextView title; public ContactHolder(View view) { super(view); this.thumbnail = (CircleImageView) view.findViewById(R.id.thumbnail); this.title = (TextView) view.findViewById(R.id.title); view.setOnClickListener(this); } @Override public void onClick(View v) { final Contact contact = contactList.get(getAdapterPosition()); final Dialog dialog = new Dialog(mContext); dialog.setCanceledOnTouchOutside(true); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.custom); final Window window = dialog.getWindow(); WindowManager.LayoutParams wlp =window.getAttributes(); wlp.gravity = Gravity.CENTER_HORIZONTAL|Gravity.TOP; wlp.y=320; window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); window.setAttributes(wlp); // set the custom dialog components - text, image and button TextView txtusername = (TextView) dialog.findViewById(R.id.txtusername); TextView txtmobile = (TextView) dialog.findViewById(R.id.txtmobile); TextView txtemail = (TextView) dialog.findViewById(R.id.txtemail); txtusername.setText(contact.getmUserName()); txtemail.setText(contact.getmEmailId()); txtmobile.setText(contact.getmMobileNo()); SquareImageView image = (SquareImageView) dialog.findViewById(R.id.image); ImageView image1 = (ImageView) dialog.findViewById(R.id.image1); ImageView image2 = (ImageView) dialog.findViewById(R.id.image2); ImageView image3 = (ImageView) dialog.findViewById(R.id.image3); if(contact.getmProfileImage().equals("")) { image.setImageDrawable(ContextCompat.getDrawable(mContext,R.drawable.profile_icon)); } else { File file = new File(Environment.getExternalStorageDirectory() + "/ContactProfileImages/" + contact.getmProfileImage()); BitmapFactory.Options bmOptions = new BitmapFactory.Options(); Bitmap bitmap = BitmapFactory.decodeFile(file.getPath(), bmOptions); image.setImageBitmap(bitmap); } image1.setImageResource(R.drawable.ic_call_black_24dp); image2.setImageResource(R.drawable.ic_textsms_black_24dp); image3.setImageResource(R.drawable.ic_email_black_24dp); image2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Uri sms_uri = Uri.parse("smsto:" + contact.getmMobileNo()); Intent sms_intent = new Intent(Intent.ACTION_SENDTO, sms_uri); mContext.startActivity(sms_intent); dialog.dismiss(); } }); image1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + contact.getmMobileNo())); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); mContext.startActivity(intent); dialog.dismiss(); } }); image3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent email = new Intent(Intent.ACTION_SEND); email.putExtra(Intent.EXTRA_EMAIL, new String[]{contact.getmEmailId()}); email.setType("message/rfc822"); mContext.startActivity(Intent.createChooser(email, "Choose an Email client :")); } }); Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK); // if button is clicked, view all information custom dialog dialogButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ((MainActivity)mContext).finish(); Intent intent = new Intent(mContext,DetailViewActivity.class); intent.putExtra("contact",contact); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); mContext.startActivity(intent); dialog.dismiss(); } }); dialog.show(); } } } 

    EDIT: Ich suchte das gleiche Problem mit Picasso-Bibliothek, wenn wir Bilder vom Server laden, dafür bekam ich die Lösung von SO als:

      recyclerView.setHasFixedSize(true); recyclerView.setItemViewCacheSize(20); recyclerView.setDrawingCacheEnabled(true); recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 

    Und das hat gearbeitet, wenn ich die Bilder vom Server lade, aber wenn ich die Bilder aus dem externen Speicher lade, ist das Problem noch vorhanden.

    Kann jemand damit helfen? Vielen Dank..

  • Nach Update auf Android Studio 2.2 / gradle Plugin 2.2.0: "konnte nicht unbekanntes Eigentum" assembleRelease "
  • Ist es möglich, ListPreference Artikel aus einem Adapter zu laden?
  • "Net :: ERR_CACHE_MISS" beim Laden einer externen URL in Cordova
  • Wie kann ich meine Anwendung Geräte-Administrator in Android?
  • Android - Wie kann ich meine kostenlose App mit der Pro Version verknüpfen?
  • Android & Facebook SDK: Decodierung von Bildern von / me / picture graph call
  • 6 Solutions collect form web for “Lazy Loading funktioniert nicht richtig”

    Dann Laden der Bilder aus externem Speicher. Ich kann die geladenen Bilder sehen, aber da ich rolle, kann ich einige Bilder für eine Sekunde oder zwei sehen, dann verschwinden sie und ich sehe das Standardbildsymbol.

    Dies ist, weil Sie Target Rückruf in Picasso verwenden. Und Rückrufe werden wenig spät genannt, wenn man die Liste scrollt. Entfernen Sie einfach das Ziel und nutzen Sie die Bildansicht in Picasso, es sollte gut funktionieren. Auch brauchst du keine Bitmaps auf eigene Faust, wie Picasso es für dich tut.

     @Override public void onBindViewHolder(final ContactHolder contactHolder, int i) { final Contact contact = contactList.get(i); // Log.e("Imagename",""+"http://xesoftwares.co.in/contactsapi/profile_images/85368a5bbd6cffba8a3aa202a80563a2.jpg");//+feedItem.getThumbnail()); String url = ServiceUrl.getBaseUrl() + ServiceUrl.getImageUserUrl() + contact.getmProfileImage(); Log.e("url",url); if(contact.getmProfileImage().equals("")) { file = new File(""); fileExists = file.exists(); contactHolder.thumbnail.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.ic_account_circle_black_48dp)); } else { file = new File(Environment.getExternalStorageDirectory() + "/ContactProfileImages/" + contact.getmProfileImage()); fileExists = file.exists(); } Log.e("Picasso",file.getAbsolutePath()); Picasso.with(mContext).load(url) .error(R.drawable.ic_account_circle_black_24dp) .placeholder(R.drawable.ic_account_circle_black_24dp) .into(contactHolder.thumbnail); contactHolder.title.setText(contact.getmUserName()); //feedListRowHolder.genre.setText(Html.fromHtml(feedItem.getGenre())); } 

    Verwenden Sie diesen Code in Ihrer Anwendungsklasse, um die Einstellung in der gesamten App anzuwenden.

      final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); // Use 1/8th of the available memory for this memory cache. final int cacheSize = maxMemory / 8; Picasso.Builder builder = new Picasso.Builder(getApplicationContext()); builder.memoryCache(new LruCache(cacheSize)); Picasso built = builder.build(); built.setIndicatorsEnabled(true);// it will show indicator where it downloaded from built.setLoggingEnabled(false); Picasso.setSingletonInstance(built); 

    Jetzt passiere die url zu Picasso, um es zu laden, um zu sehen. Wenn du mit großem Bild umgibst, kannst du die Bildgröße auch für ein schnelleres Laden ändern.

      Picasso.with(mContext).load(url) .error(R.drawable.on_error) .placeholder(R.drawable.place_holder) //.resize(custom_width,custom_height) put custom_height to 0 if you want to maintain aspect ratio .into(your_view); 

    Ich kann mich irren, aber dein Problem könnte dadurch verursacht werden, dass du Contact hast, den du von deinem Dataset über die Layout-Position onBitmapLoaded , aber da du es asynchron in onBitmapLoaded Callback einsetzest, könnte die Position bereits in diesem Moment geändert werden. Also alles, was Sie brauchen, ist, Adapterposition wie folgt zu verwenden:

     @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // your code here ... Contact c = contactList.get(contactHolder.getAdapterPosition()); bitmap = Bitmap.createScaledBitmap(bitmap,(int)(bitmap.getWidth()*0.8), (int)(bitmap.getHeight()*0.8), true); contactHolder.thumbnail.setImageBitmap(bitmap); Log.e("ProfileImage", c.getmProfileImage()); SaveImages(bitmap, c.getmProfileImage()); } 

    Ich bin mir nicht sicher, dass es hilfreich wäre, aber versuchen wir es, und ich hoffe es wird 🙂

    Wenn du das Bild einfach laden möchtest, dann musst du in den externen Speicher speichern.wenn du für jeden anderen Zweck speichern musst, dann schreib es aber wenn du es in der ImageView zeigst, dann benutze bitte Dritte AIP wie Picasso oder Universal Image Loader es ist faul geladen und auch es tut alle Arten von Cache-Speicher-Management auch viele Display-Fasalität.

    Hoffe das wird dir helfen

    Operationen wie das Laden von Bildern sollte mit AsyncTask auf einem Hintergrund-Thread durchgeführt werden.

    • Überprüfe jedem Bild, wie viel MB es ist. Zum Beispiel: Wenn das Bild 1 MB oder 500 kb ist, dauert es mehr Zeit, um Bilder im Hintergrund herunterzuladen und nach dem Herunterladen wird es in catche speichern. Das bedeutet erstmal nur, dass es einige Zeit dauert, das Bild herunterzuladen.

    • Zum zweiten Mal, diese Bilder von catche.It zeigt alle Bilder in den Bruchteil von Sekunden.

    • Benutzen Sie Volley – für schneller und gleiten – für Speicherverwaltung.

       Glide.with(context).load(rowItem.getPosteduserpostimage()).asBitmap().diskCacheStrategy(DiskCacheStrategy.SOURCE).fitCenter() .placeholder(R.drawable.load_image).error(R.drawable.cancel_image).into(holder.ivPostedImageNew); 
    • Verweisen Sie hier, wie man große Bitmap lädt. Sie müssen das Bild vergrößern.

    • Ansonsten, wenn ich jedes Bild hochlade, habe ich mit der Bibliothek geerntet. Es kümmert sich um Skala nach unten große Bitmap. Zum Beispiel: 5mb Bilder werden bis zu 180 kb skaliert.

    • Überprüfen Sie diese CropImage lib , um größere Bilder vergrößern.Even, wenn Benutzer nicht zuschneiden Bild, wählen Sie einfach den gesamten Teil beim Zuschneiden, wird es skalieren 5 mb bis 180kb.Image Qualität auch gut.

    Ich denke, ohne Zuschneiden können Sie auch die unten genannten Code zu skalieren Bild.Sie können diesen Code in diesem:

      private void startCropImage() { Intent intent = new Intent(this, CropImage.class); intent.putExtra(CropImage.IMAGE_PATH, mFileTemp.getPath()); intent.putExtra(CropImage.SCALE, true); intent.putExtra(CropImage.ASPECT_X, 0); //3 for aspect ratio intent.putExtra(CropImage.ASPECT_Y, 0); //2 for aspect ratio startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE); } 
    • Und auch keine verschachtelte Scroll-Ansicht in recyclerview verwenden.
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.