2016-09-28 12 views
1

おそらく私の経験が不足しているので、私はこれを回避することはできません。私はサーバー上に画像を持っていますが、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に配置する必要がありますが、毎回ダウンロードされないようにキャッシュされるようにします。

答えて

0

ねえ、私はあなたのアプリのために非常にシンプルでキャッシュイメージを使用するように提案したいと思います、私はそれを自分で試してみました。また、次回の更新時に変更する必要があるように、URLに署名を追加することもできます。以下

Glide Url

は、コードスニペット

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

}

String imgUrl = "http://imageurl"; 

ImageViewのImageViewの=(ImageViewの)view.findViewById(R.id.thumbnail)です。

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

・ホープ、このことができます:)

+0

をねえ、私はすでにグライドを使用しているが、私は何とか、サーバからイメージを取得する必要があり、私はボレーを使用する理由です。残りは私の質問です。 :) – jlively

+0

イメージを取得したいですか?もしそうなら、あなたはイメージをサーバーに保存しなければなりません。イメージのリンクをフェッチする必要があります。ボレーの代わりにレトロフィットを使用することができます。 –

+0

ダーパン、私はすでにそれをすべて終えました。私が知りたいのは、ボレーで取り込まれ、グライドで画像ビューに表示された画像がキャッシュされている場合です。次回は、アプリを実行すると、グライドはキャッシュされた画像をロードするか、またはボレーがそれらを再度フェッチするのを待ちますか?私はまた、このためのベストプラクティスが何かを知りたいと思います。 – jlively

関連する問題