在Android中使用Glide进行图片缓存

时间:2019-05-02 19:46:48

标签: android android-glide

我正在使用Glide在我的应用程序中加载图像。当应用启动Home片段中的MainActivity中的Home片段加载时,我正在视图分页器中获取图像。当我在这些片段之间切换并返回Home片段时,需要一些时间才能在View分页器中加载图像,为什么它不像我那样快速加载图像我正在使用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 :(得分:0)

创建新课程

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