Android 如何清除在片段中压回的图像缓存?

Android 如何清除在片段中压回的图像缓存?,android,android-fragments,caching,Android,Android Fragments,Caching,我有一个从main活动调用的片段。这个片段获取图像URL的JSON文件,并在屏幕上显示图像。 我已经使用Fresco库下载了这些图像,然后作为图像列表视图弹出。图像由Fresco库自动缓存 当我从片段中执行回按时,我想删除所有缓存的图像。 当用户向下滚动列表时,图像会立即取消缓存,我想在用户在片段中执行回按时取消缓存所有图像 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,

我有一个从main活动调用的片段。这个片段获取图像URL的JSON文件,并在屏幕上显示图像。 我已经使用Fresco库下载了这些图像,然后作为图像列表视图弹出。图像由Fresco库自动缓存

当我从片段中执行回按时,我想删除所有缓存的图像。 当用户向下滚动列表时,图像会立即取消缓存,我想在用户在片段中执行回按时取消缓存所有图像

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view  = inflater.inflate(R.layout.fragment_gallery, container, false);
    private List<gallery_adapter> gallery_adapterList = new ArrayList<>();
    ListView list = (ListView) view.findViewById(R.id.galleryList);

    gallery_adapterList.clear();
    if(isNetworkConnected()){
        new galleryImages().execute("http://www.myurl.json");
    }else
        Toast.makeText(context,"No Internet Connection!",Toast.LENGTH_SHORT).show();

    return view;
}






public class galleryImages extends AsyncTask<String, String, String> {

    HttpURLConnection connection;
    BufferedReader reader;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            InputStream stream = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuilder builder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
            String str = builder.toString();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        if(s!=null){


            try {
                JSONObject parent = new JSONObject(s);
                JSONArray images = parent.getJSONArray("images");

                if(images!=null){

                    for(int i=0; i<images.length();i++){
                        JSONObject child = images.getJSONObject(i);
                        gallery_adapterList.add(new gallery_adapter(child.getString("url"),child.getString("text")));
                    }
                    displayList();

                }else
                    Toast.makeText(context,"error",Toast.LENGTH_SHORT).show();

            } catch (JSONException e) {
                Toast.makeText(context, "Images not yet added. Try later",Toast.LENGTH_SHORT).show();
            }


        }else
            Toast.makeText(context, "Images not yet added. Try later",Toast.LENGTH_SHORT).show();
    }
}
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment_gallery,container,false);
私有列表库_adapterList=new ArrayList();
ListView list=(ListView)view.findViewById(R.id.galleryList);
gallery_适配器列表。清除();
如果(isNetworkConnected()){
新建GalleryImage()。执行(“http://www.myurl.json");
}否则
Toast.makeText(上下文,“无Internet连接!”,Toast.LENGTH_SHORT.show();
返回视图;
}
公共类GalleryImage扩展异步任务{
httpurl连接;
缓冲读取器;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
URL=新URL(参数[0]);
connection=(HttpURLConnection)url.openConnection();
InputStream=connection.getInputStream();
reader=新的BufferedReader(新的InputStreamReader(流));
StringBuilder=新的StringBuilder();
弦线;
而((line=reader.readLine())!=null){
builder.append(行);
}
字符串str=builder.toString();
返回str;
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
如果(s!=null){
试一试{
JSONObject父对象=新的JSONObject;
JSONArray images=parent.getJSONArray(“images”);
如果(图像!=null){

对于(int i=0;i我想你是什么,但是如果我可以的话,你为什么要清除缓存?因为下次用户打开活动时,他需要再次等待json响应,下面是你可以这样做的选项:

1.您可以在片段中缓存backpress事件,并调用函数清除缓存图像


2.根据片段的onAttach(上下文)跟踪片段,这意味着您需要编写
FragmentManager.addonbackbackbackchangedlistener();
如果您已使用addtoBackStack添加了片段,则将调用该方法。

此方法将在MainActivity中调用,对吗?那么我将如何获取MainActivity中的URL列表,以便它们可以被取消缓存?您可以使用应用程序类获取URL列表,也可以使用声明接口与Activity的片段通信谢谢@Herry.使用应用程序类获取详细信息,然后将其发送到片段以显示图像如果我的答案帮助您解决问题,您可以接受@Avinash_ks
private void displayList() {
    ArrayAdapter<gallery_adapter> adapter = new galleryAdapterList();
    list.setAdapter(adapter);
}

public class galleryAdapterList extends ArrayAdapter<gallery_adapter> {

    galleryAdapterList() {
        super(context, R.layout.gallery_item, gallery_adapterList);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.gallery_item, parent, false);
        }

        gallery_adapter current = gallery_adapterList.get(position);


        TextView mText=(TextView) convertView.findViewById(R.id.galleryText);
        mText.setText(current.getText());


        uri = Uri.parse(current.getUrl());
//code to remove images from cache
        ImagePipeline imagePipeline = Fresco.getImagePipeline();
        imagePipeline.evictFromCache(uri);     
//code ends here


        SimpleDraweeView mImage = (SimpleDraweeView) convertView.findViewById(R.id.galleryImage);
        mImage.setImageURI(uri);


        return convertView;
    }

}