2016-04-06 1 views
0

Bonjour je suis débutant dans anroid. J'ai créé un tiroir de navigation et des fragments. Je peux obtenir des données de JSON avec l'url. Cela fonctionne en ligne. Mais téléphone quand déconnecté je reçois l'erreur "incapable de résoudre l'hôte". Je veux obtenir des données de l'URL avec json en mode hors connexion. Il n'est pas la mise en cache enter image description herevolley json image du cache ne fonctionne pas hors ligne

fragment

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

et CustomListAdapter (extension 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); 
} 
+0

comment obtenir des données d'URL en mode hors connexion? C'est la question? – JimHawkins

+0

@Ulrich il doit être mis en cache en ligne – qwerty

Répondre

1

vos photos (http://www.iremdeveci.com/ornekler/resimler/resim.png) semble être mis en cache correctement comme th Nous avons des en-têtes etag et cache.

Cependant la toute première requête que vous faites (http://sunumsitesi.com/json.php) ne semble pas retourner les en-têtes de cache ni etag. Ainsi vous avez l'erreur que vous n'atteignez même pas la partie image.

Vous pouvez résoudre ce problème à partir du serveur ou faire le cache Volley tout, dont vous avez besoin pour créer la demande personnalisée et passer outre

protected Response<String> parseNetworkResponse(NetworkResponse response) 

Vous pouvez vérifier ma réponse here.

Dans votre code ce serait lissée comme

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

mais pour NetworkImage voir que vous devez personnaliser ImageLoader car cela est une création des demandes d'image et la logique est la même. Vous devez remplacer "makeImageRequest".

ex:

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

     }; 
      } 
}; 
    ... 
+0

Y at-il un exemple simple de cela? – qwerty

+0

vérifier le lien dans la réponse – djodjo

+0

Si vous ne voulez pas aider ne pas engager – qwerty