2016-09-28 1 views
1

Ich kann meinen Kopf nicht darum wickeln, wahrscheinlich aus Mangel an meiner Erfahrung. Ich habe Bilder auf dem Server, ich bekomme ihren Pfad in JSON zusammen mit Beschreibung und einem Namen. Ich bekomme all diese Daten mit Volley.Verwenden von Volley und Glide zum Herunterladen, Anzeigen und Zwischenspeichern von Bildern

private static final String TAG = "StoreActivity"; 
private RecyclerView shopsRecyclerView; 
private RecyclerView.LayoutManager layoutManager; 
private ArrayList<Store> stores; 
private StoreAdapter storeAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_store); 

    shopsRecyclerView = (RecyclerView) findViewById(R.id.shopsRecyclerView); 
    shopsRecyclerView.setHasFixedSize(true); 
    layoutManager = new LinearLayoutManager(this); 
    shopsRecyclerView.setLayoutManager(layoutManager); 
    stores = new ArrayList<>(); 
    storeAdapter = new StoreAdapter(getApplicationContext(), stores); 
    shopsRecyclerView.addOnItemTouchListener(new StoreAdapter.RecyclerTouchListener(getApplicationContext(), shopsRecyclerView, new StoreAdapter.ClickListener() { 
     @Override 
     public void onClick(View view, int position) { 
      Intent i = new Intent(StoreActivity.this, ProductsActivity.class); 
      startActivity(i); 
     } 

     @Override 
     public void onLongClick(View view, int position) { 

     } 
    })); 
    fetchStores(); 
} 

private void fetchStores() { 
    JsonObjectRequest fetchAllStores = new JsonObjectRequest(Request.Method.POST, API.GET_STORES, null, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      Log.d(TAG, "Fetch Stores: " + response); 
      showStores(response); 
      shopsRecyclerView.setAdapter(storeAdapter); 
      storeAdapter.notifyDataSetChanged(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.d(TAG, "Fetch Stores Error: " + error.getMessage()); 
     } 
    }); 
    ApplicationController.getInstance().addToRequestQueue(fetchAllStores); 
} 

private void showStores(JSONObject response) { 
    try { 
     JSONArray jsonArray = response.getJSONArray("images"); 
     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject jsonObject = jsonArray.getJSONObject(i); 
      Store store = new Store(); 
      store.setId(jsonObject.getString("id")); 
      store.setImage_url(jsonObject.getString("url")); 
      store.setTitle(jsonObject.getString("name")); 
      stores.add(store); 
     } 
    } catch (JSONException e) { 
     Log.d(TAG, "Show Stores: " + e.getMessage()); 
    } 
} 

Dann habe ich diesen Weg/url ich von Volley in Glide bekam und alle Bilder in RecyclerView laden.

@Override 
public void onBindViewHolder(StoreViewHolder holder, final int position) { 
    Store store = stores.get(position); 
    holder.tvDescription.setText(store.getTitle()); 
    Glide.with(context) 
      .load(store.getImage_url()) 
      .placeholder(android.R.drawable.ic_menu_upload_you_tube) 
      .error(android.R.drawable.stat_notify_error) 
      .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
      .into(holder.ivImage); 

} 

Wenn ich das nächste Mal die gleiche Aktivität einschalte, wird die Anfrage erneut gesendet und die Bilder werden erneut heruntergeladen? Oder sind sie vorher irgendwie zwischengespeichert und werden sie aus dem Cache geladen? Wenn ich das Internet ausschalte und die gleiche Aktivität aktiviere, passiert nichts, weil die Volley-Anfrage nicht gesendet werden kann und die Bilder, von denen ich dachte, dass sie zwischengespeichert sind, werden nicht angezeigt. Was wäre der beste Ansatz für mein Problem? Grundsätzlich muss ich den Pfad der Bilder vom Server abrufen und sie in meine Recycleransicht einfügen, aber ich möchte auch, dass sie im Cache gespeichert werden, damit sie nicht jedes Mal heruntergeladen werden.

Antwort

0

hey ich möchte Ihnen vorschlagen, Glide lib zu verwenden, sehr einfach und speichert Bilder für Ihre App, ich habe es selbst ausprobiert. Sie können der URL auch eine Signatur hinzufügen, damit sie beim nächsten Mal aktualisiert wird.

Glide Url

Unten ist Code-Schnipsel

dependencies { 
// glide 
compile 'com.github.bumptech.glide:glide:3.7.0' 

}

String imgUrl = "http://imageurl"; 

Imageimageview = (Image) view.findViewById (R.id.thumbnail);

Glide.with(mContext).load(imgUrl) 
      .thumbnail(0.5f) 
      .crossFade() 
      .diskCacheStrategy(DiskCacheStrategy.ALL) 
      .into(imageView); 

this helps :)

+0

Hey, ich habe Glide bereits verwendet, aber ich muss irgendwie die Bilder vom Server erhalten, und das ist, warum ich Volley verwenden. Der Rest ist in meiner Frage. :) – jlively

+0

Sie möchten Bilder holen? Wenn ja, dann müssen Sie Bilder auf dem Server speichern, dann müssen Sie die Links der Bilder holen. Sie können Retrofit anstelle von Volley verwenden. –

+0

Darpan, ich habe das alles schon gemacht. Was ich wissen möchte, ist, wenn die Bilder, die mit Volley geholt und dann in den Bildansichten mit Glide gezeigt werden, zwischengespeichert werden? Wenn ich das nächste Mal die App starte, wird Glide die zwischengespeicherten Bilder laden oder warten, bis Volley sie wieder holt? Ich würde auch gerne wissen, was die besten Praktiken dafür sind. – jlively

Verwandte Themen