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.
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
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. –
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