2016-09-28 2 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()); 
    } 
} 

Тогда я положил, что путь/URL я получил от Volley в Glide и загрузить все изображения в RecyclerView.

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

} 

В следующий раз активируй свою операцию, этот запрос будет отправлен еще раз и изображения будут загружены раз в день? Или они каким-то образом кэшируются, и они загружаются из кеша? Когда я выключаю интернет и включаю одно и то же действие, ничего не происходит, потому что запрос на залп не может быть отправлен, и изображения, которые, как я думал, были кешированы, не отображаются. Что было бы лучшим подходом к моей проблеме? В принципе, мне нужно получить путь к изображениям с сервера и поместить их в мой recyclerview, но я также хочу, чтобы они были кэшированы, чтобы они не загружались каждый раз.

ответ

0

эй, я хотел бы предложить вам использовать Glide lib, очень простые и кэшировать изображения для вашего приложения, я сам пробовал. Вы также можете добавить подпись к 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

Эй, я уже использовал Glide, но я какой-то образом получить изображения с сервера, и именно поэтому я использую залп. Остальное - в моем вопросе. :) – jlively

+0

вы хотите получить изображения? если да, то вам нужно сохранить изображения на сервер, тогда вам нужно будет получить ссылки на изображения. вы можете использовать Retrofit вместо volley. –

+0

Дарпан, я уже все это сделал. То, что я хочу знать, это то, что изображения, полученные волейболом, а затем показаны в изображениях с Glide, кэшируются? В следующий раз, когда я запустил приложение, Glide загрузит кешированные изображения или дождитесь, пока залп снова их заберет? Я также хотел бы знать, каковы наилучшие методы для этого. – jlively