Как я могу очистить кэш-память виджета Android, когда закрываю свою деятельность (повторяющиеся изображения) - PullRequest
0 голосов
/ 15 сентября 2018

Я новичок в Android Studio, я показал список изображений и текста в своей основной деятельности, все работало нормально, пока у меня не возникли проблемы с производительностью, которые были решены с помощью этого урока:

https://www.youtube.com/watch?v=cKUxiqNB5y0 (приложение, показанное на видео, почти совпадает с моим)

Моя проблема сейчас заключается в том, что при создании новых объектов, добавляемых в просмотр списка, изображения дублируются при обновлении приложения (Я думаю, что это проблема с кешем, потому что я использую универсальный загрузчик изображений).

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import java.util.List;

public class CharacterListAdapter extends ArrayAdapter<AnimeCharacter> {
    private static final String TAG = "AnimeCharacterAdapter";
    private Context context;
    private int mResource;

    static class ViewHolder {
        TextView character_name;
        TextView character_anime;
        ImageView img;
    }

    public CharacterListAdapter(@NonNull Context context, int resource, @NonNull List<AnimeCharacter> objects) {
        super(context, resource, objects);
        this.context = context;
        mResource = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        setup_image_loader();

        String character_name = getItem(position).getCharacter_name();
        String character_anime = getItem(position).getCharacter_anime();
        String img_url = getItem(position).getCharacter_img();

        ViewHolder view_holder;
        view_holder = new ViewHolder();

        if (convertView == null) {
            LayoutInflater layout_inflater = LayoutInflater.from(context);
            convertView = layout_inflater.inflate(mResource, parent, false);
            view_holder.character_name = convertView.findViewById(R.id.txt_character_name);
            view_holder.character_anime = convertView.findViewById(R.id.txt_anime_name);
            view_holder.img = convertView.findViewById(R.id.character_img);


            convertView.setTag(view_holder);

        } else {
            view_holder = (ViewHolder) convertView.getTag();
        }

        int default_img = context.getResources().getIdentifier("@drawable/img_default", null, context.getPackageName());

        ImageLoader imageLoader = ImageLoader.getInstance();

        DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
                .cacheOnDisc(true).resetViewBeforeLoading(true)
                .showImageForEmptyUri(default_img)
                .showImageOnFail(default_img)
                .showImageOnLoading(default_img).build();

        imageLoader.displayImage(img_url, view_holder.img, options);

        view_holder.character_name.setText(character_name);
        view_holder.character_anime.setText(character_anime);



//        ImageLoader.getInstance().clearMemoryCache();
//        ImageLoader.getInstance().clearDiskCache();

        return convertView;
    }

    private void setup_image_loader() {
        // UNIVERSAL IMAGE LOADER SETUP
        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheOnDisc(true).cacheInMemory(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .displayer(new FadeInBitmapDisplayer(300)).build();

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                context)
                .defaultDisplayImageOptions(defaultOptions)
                .memoryCache(new WeakMemoryCache())
                .discCacheSize(100 * 1024 * 1024).build();


        ImageLoader.getInstance().init(config);
        // END - UNIVERSAL IMAGE LOADER SETUP
    }

}

Я нашел другие посты, где решение очищало кеш с помощью следующих строк кода:

ImageLoader.getInstance().clearMemoryCache();
ImageLoader.getInstance().clearDiskCache();

Моя проблема в том, что я не знаю, как переопределить метод "onDestroy" внутри Адаптера, в этом посте они включили его в MainActivity

android универсальный загрузчик изображений очистить кеш

Последнее, когда я удаляю приложение на своем телефоне и перестраиваю его, проблема исчезает (пока я не добавлю другой объект в просмотр списка)

1 Ответ

0 голосов
/ 30 сентября 2018

Я решил с этим кодом:

@Override
protected void onDestroy() {
    super.onDestroy();
    try {
        trimCache(this);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public static void trimCache(Context context) {
    try {
        File dir = context.getCacheDir();
        if (dir != null && dir.isDirectory()) {
            deleteDir(dir);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}

public static boolean deleteDir(File dir) {
    if (dir != null && dir.isDirectory()) {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }

    // The directory is now empty so delete it
    return dir.delete();
}
...