おそらく私の経験が不足しているので、私はこれを回避することはできません。私はサーバー上に画像を持っていますが、JSONで説明と名前とともにそのパスを取得します。私はVolleyとそのデータのすべてを得ています。volleyとGlideを使用して画像をダウンロード、表示、キャッシュする
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());
}
}
次に、私はVolley in Glideから取得し、すべての画像をRecyclerViewに読み込みます。
次回同じアクティビティをオンにすると、リクエストが再度送信され、イメージが再度ダウンロードされますか?または、以前に何とかキャッシュされていて、キャッシュからロードされていますか? インターネットをオフにして同じアクティビティをオンにすると、ボレーのリクエストを送信できないため、何も起こりません。キャッシュされたと思われる画像は表示されません。 私の問題に最も適した方法は何ですか?基本的には、サーバーからイメージのパスを取得し、私のrecyclerviewに配置する必要がありますが、毎回ダウンロードされないようにキャッシュされるようにします。
をねえ、私はすでにグライドを使用しているが、私は何とか、サーバからイメージを取得する必要があり、私はボレーを使用する理由です。残りは私の質問です。 :) – jlively
イメージを取得したいですか?もしそうなら、あなたはイメージをサーバーに保存しなければなりません。イメージのリンクをフェッチする必要があります。ボレーの代わりにレトロフィットを使用することができます。 –
ダーパン、私はすでにそれをすべて終えました。私が知りたいのは、ボレーで取り込まれ、グライドで画像ビューに表示された画像がキャッシュされている場合です。次回は、アプリを実行すると、グライドはキャッシュされた画像をロードするか、またはボレーがそれらを再度フェッチするのを待ちますか?私はまた、このためのベストプラクティスが何かを知りたいと思います。 – jlively