Кэширование изображений с помощью Glide в Android - PullRequest
0 голосов
/ 02 мая 2019

Я использую Glide для загрузки изображений в мое приложение. Когда приложение запускает загрузку фрагмента Home в MainActivity во фрагменте Home, я извлекаю изображения в пейджере просмотра. Когда я переключаюсь между фрагментами и возвращаюсь во фрагмент Home, требуется некоторое время для загрузки изображений в пейджере просмотра, почему он не загружает изображения так быстро, как я? Я использую свойство Caching, предоставленное Glide.

То, что я делал до сих пор, это

Home.java

public class Home extends Fragment{ 

ViewPager bannerViewPager;
BannerAdapter adapter;
List<BannerModel> banners;
TabLayout tabLayout;
RequestQueue requestQueue;
StringRequest stringRequest;    

private static final String URI = "https://www.example.com";

 public Home() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_home, container, false);

    tabLayout = view.findViewById(R.id.tabLayout);
    bannerViewPager = view.findViewById(R.id.bannerViewpager);

    tabLayout.setupWithViewPager(bannerViewPager, true);

    banners = new ArrayList<>();

    loadViewPager();

    return view;

 }    

 public void loadViewPager() {

      requestQueue = Volley.newRequestQueue(getActivity());

      stringRequest = new StringRequest(Request.Method.GET,URI, new Response.Listener<String>() {

      @Override
        public void onResponse(String response) {

        try {

                JSONArray jsonArray = new JSONArray(response);

                for(int i = 0;i<jsonArray.length();i++){

                    JSONObject jsonObject = jsonArray.getJSONObject(i);

                    String loadImages = jsonObject.getString("Image");

                    BannerModel model = new BannerModel(loadImages);
                    banners.add(model);

                }

                adapter = new BannerAdapter(banners,getActivity());

                bannerViewPager.setAdapter(adapter);

            }catch(JSONException e){
              e.printStackTrace();
          }

       }

    },new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

            TastyToast.makeText(getActivity(),"Error:"+error.getMessage(),TastyToast.LENGTH_SHORT,TastyToast.ERROR).show();
        }
    });

      requestQueue.add(stringRequest);
  }

}

GlideSingleton.java

public class GlideSingleton {

private static GlideSingleton  obj;
public RequestOptions options;

private GlideSingleton(){

    options = new RequestOptions();
    options.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC);
}

public static synchronized GlideSingleton getInstance(){

    if(obj == null){

        obj = new GlideSingleton();
    }
    return obj;
  }
}

BannerAdapter.java

public class BannerAdapter extends PagerAdapter {

private LayoutInflater layoutInflater;
Context context;
private List<BannerModel> banners;

public BannerAdapter(List<BannerModel> banners,Context context){

    this.banners = banners;
    this.context = context;
}

@Override
public int getCount() {
    return banners.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
    return view == o;
  }

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {

    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    assert layoutInflater != null;
    View view = layoutInflater.inflate(R.layout.bannerlayout, null);

    ImageView offerImage = view.findViewById(R.id.offerImage);

    BannerModel model = banners.get(position);

    Glide.with(context).load(model.getBannerImage()).apply(GlideSingleton.getInstance().options).into(offerImage);

    container.addView(view);

    return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

    container.removeView((LinearLayout)object);
  } 

}

Кто-то, пожалуйста, дайте мне знать, как я могу быстро загрузить изображения после их загрузки по сети в режиме просмотра изображений. Любая помощь будет оценена.

СПАСИБО

1 Ответ

0 голосов
/ 03 мая 2019

Создать новый класс

class SingletonRequestOptions
{
    private static SingletonRequestOptions  obj;
    public RequestOptions options;
    private SingletonRequestOptions () {
        options = new RequestOptions();
        options.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC);
    }

    // Only one thread can execute this at a time
    public static synchronized SingletonRequestOptions  getInstance()
    {
        if (obj==null)
            obj = new SingletonRequestOptions ();
        return obj;
    }
}

Обновите свою строку с помощью этого

Glide.with(context).load(model.getBannerImage()).apply(SingletonRequestOptions.getInstance().options).into(offerImage);
...