当前位置: 首页 > 面试题库 >

齐射json缓存图像无法离线工作

巫马玉堂
2023-03-14
问题内容

你好,我是初学者。我创建了导航抽屉和片段。我可以使用url从json获取数据。可以在线上工作。但是,当电话离线时,我会收到“无法解析主机”错误。我想在离线时通过json从url获取数据。它不是缓存
在这里输入图像描述

分段

private static final String jsonUrl = "http://sunumsitesi.com/json.php";
private ProgressDialog pDialog;
private List<Urun> urunList = new ArrayList<Urun>();
private ListView listView;
private CustomListAdapter adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View root = inflater.inflate(R.layout.fragment_yemek, container, false);
    return root;
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    View v = getView();
    if(v!=null)
    {
        listView = (ListView) v.findViewById(R.id.yemekList);
        adapter = new CustomListAdapter(getActivity(), urunList);
        listView.setAdapter(adapter);

        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Loading...");
        pDialog.show();
        JsonArrayRequest urunReq = new JsonArrayRequest(jsonUrl, new Response.Listener<JSONArray>()
        {
            @Override
            public void onResponse(JSONArray response)
            {
                hidePDialog();
                for (int i = 0; i < response.length(); i++)
                {
                    try
                    {

                        JSONObject obj = response.getJSONObject(i);
                        Urun urun = new Urun();
                        urun.setUrun_adi(obj.getString("urun_adi"));
                        urun.setUrl("http://www.iremdeveci.com/ornekler/resimler/resim.png");//example
                        urunList.add(urun);
                    } catch (JSONException ex)
                    {
                        ex.printStackTrace();
                    }
                }
                adapter.notifyDataSetChanged();
            }
        }, new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError volleyError)
            {
                Toast.makeText(getActivity(), volleyError.getMessage(), Toast.LENGTH_LONG).show();
            }
        });
        AppController.getmInstance().addToRequestQueue(urunReq);
    }
}

@Override
public void onDestroy()
{
    super.onDestroy();
    hidePDialog();
}
private void hidePDialog()
{
    if(pDialog!=null)
    {
        pDialog.dismiss();
        pDialog=null;
    }
}

和CustomListAdapter(扩展BaseAdapter)

private Activity activity;
private LayoutInflater inflater;
private List<Urun> urunItems;
ImageLoader imageLoader = AppController.getmInstance().getmImageLoader();
public CustomListAdapter(Activity activity,List<Urun> urunItems)
{
    this.activity=activity;
    this.urunItems=urunItems;
}

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

@Override
public Object getItem(int location)
{
    return urunItems.get(location);
}

@Override
public long getItemId(int position)
{
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    if (inflater==null)
    {
        inflater=(LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    if (convertView==null)
    {
        convertView=inflater.inflate(R.layout.list_row,null);
    }
    if (imageLoader==null)
    {
        imageLoader=AppController.getmInstance().getmImageLoader();
    }
    NetworkImageView urunResim=(NetworkImageView)convertView.findViewById(R.id.urunResim);
    TextView urun_adi= (TextView)convertView.findViewById(R.id.urun_adi);
    Urun u = urunItems.get(position);

    urunResim.setImageUrl(u.getUrl(),imageLoader);
    urun_adi.setText(u.getUrun_adi());
    return convertView;
}

LruBitmapCache.java

public static int getDefaultLruCacheSize()
{
    final int maxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
    final int cacheSize= maxMemory/8;
    return cacheSize;
}
public LruBitmapCache()
{
    this(getDefaultLruCacheSize());
}
public LruBitmapCache(int sizeInKiloBytes)
{
    super(sizeInKiloBytes);
}

@Override
protected int sizeOf(String key, Bitmap value)
{
    return value.getRowBytes() * value.getHeight()/1024;
}

@Override
public Bitmap getBitmap(String url)
{
    return get(url);
}

@Override
public void putBitmap(String url, Bitmap bitmap)
{
    put(url,bitmap);
}

问题答案:

您的图片(http://www.iremdeveci.com/ornekler/resimler/resim.png)似乎已正确缓存,因为具有etag和cache标头。

但是,您发出的第一个请求(http://sunumsitesi.com/json.php)似乎既不返回缓存头也不返回etag。因此,您有错误甚至没有到达图片部分。

您可以从服务器修复该问题,也可以让Volley缓存所有这些,您需要为其创建自定义请求并覆盖

protected Response<String> parseNetworkResponse(NetworkResponse response)

在您的代码中,这就像

        JsonArrayRequest urunReq = new JsonArrayRequest(jsonUrl, new Response.Listener<JSONArray>()
    {
        @Override
        public void onResponse(JSONArray response)
        {
            String dosyakonum = "http://www.pukkaliving.concept.com/upload/galeri/buyuk/";
            hidePDialog();
            for (int i = 0; i < response.length(); i++)
            {
                try
                {

                    JSONObject obj = response.getJSONObject(i);
                    Urun urun = new Urun();
                    urun.setUrun_adi(obj.getString("urun_adi"));
                    urun.setUrl("http://www.iremdeveci.com/ornekler/resimler/resim.png");//example
                    urunList.add(urun);
                } catch (JSONException ex)
                {
                    ex.printStackTrace();
                }
            }
            adapter.notifyDataSetChanged();
        }
    }, new Response.ErrorListener()
    {
        @Override
        public void onErrorResponse(VolleyError volleyError)
        {
            Toast.makeText(getActivity(), volleyError.getMessage(), Toast.LENGTH_LONG).show();
        }
    }) {
        @Override
        protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString =
                        new String(response.data, HttpHeaderParser.parseCharset(response.headers));

                long now = System.currentTimeMillis();
                Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
                entry.ttl = now + 30l * 24 * 60 * 60 * 1000;  //keeps cache for 30 days
entry.softTtl = now + 1 * 24 * 60 * 60 * 1000;  //will not try to refresh for 1 day     
                    return Response.success(new JSONArray(jsonString), entry);
                } catch (UnsupportedEncodingException e) {
                    return Response.error(new ParseError(e));
                } catch (JSONException je) {
                    return Response.error(new ParseError(je));
                }
            }
        };
        AppController.getmInstance().addToRequestQueue(urunReq);

但是对于NetworkImage视图,您必须自定义ImageLoader,因为这是创建图像请求的对象,然后逻辑是相同的。您必须覆盖“
makeImageRequest”。

例如:

  ...
mImageLoader = new ImageLoader(this.mRequestQueue,
                    new LruBitmapCache()) {
    @Override
        protected Request<Bitmap> makeImageRequest(String requestUrl, int maxWidth, int maxHeight,
                    ScaleType scaleType, final String cacheKey) {
                return new ImageRequest(requestUrl, new Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                        onGetImageSuccess(cacheKey, response);
                    }
                }, maxWidth, maxHeight, scaleType, Config.RGB_565, new ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        onGetImageError(cacheKey, error);
                    }
                }){
          @Override
                    public Response<Bitmap> parseNetworkResponse(NetworkResponse response) {
                        Response<Bitmap> resp = super.parseNetworkResponse(response);
                        if(!resp.isSuccess()) {
                            return resp;
                        }
                        long now = System.currentTimeMillis();
                        Cache.Entry entry = resp.cacheEntry;
                        entry.ttl = now + 30l * 24 * 60 * 60 * 1000;  //keeps cache for 30 days
                        return Response.success(resp.result, entry);
                    }

        };
            }
};
    ...


 类似资料:
  • 实现UIWebView页面离线缓存功能。作者QQ:867187831

  • 通过前面章节对 PWA 概念的了解,我们知道,离线缓存是 PWA 应用在体验提升上的一个重要特性,离线缓存特性能够使得 PWA 应用在离线环境下可以正常使用,在弱网环境下能够使站点快速响应。通常 PWA 的离线缓存特性主要是依赖 Web 提供的 Service Worker 机制和 Cache API 来配合实现的,并且可以在 Service Worker 文件中通过开发一系列的策略来管理网络策略

  • 服务器向我发送json对象、过期和ETAG。我希望Voley将这个对象保存在缓存中,并在下一次请求该对象时使用对服务器的请求,包括在报头中的ETag。如果响应将是304不修改,那么它应该使用缓存的资源,如果它将是200OK,它应该使用来自服务器的新资源。 Volley根本不发送请求(如果缓存未过期),或者如果缓存过期,则发送带有If-None-Match+etag字符串的新请求。并且服务器总是以2

  • 我正在尝试创建一个简单的照片库,其中一张照片是大的,也有拇指在底部,当点击成为那张大照片。画廊在单独的模式窗口。我的代码只在第一个模态窗口中工作。事实上,这是我第一次使用jQuery。我甚至找不到如何使用console.log来检查问题出在哪里。 HTML: jQuery:

  • 问题内容: 我正在从servlet提供图像。响应内容类型为image / jpeg。我发现从我的servlet请求的图像没有被缓存。如何使它们像文件图像请求通常那样被缓存?我尝试设置Cache- Control:public,但无济于事。 问题答案: 好的..看起来默认头字段应该启用缓存。我在另一个论坛上找到了解决方案。显然,您需要在响应中显式设置content- length。不知道为什么。我认

  • WordPress的示例短代码: 现在在上面的短代码中。代码中使用了一个图像。我想要获得图像,并在服务器中创建一个缓存,这样每个使用这个短代码的人都可以查看图像。目前,我正在使用base64编码的图像。