Android 使用截击和滑动下载、显示和缓存图像
我不能完全相信这一点,可能是因为缺乏经验。我在服务器上有图像,我用JSON获取它们的路径以及描述和名称。我通过截击获得所有数据Android 使用截击和滑动下载、显示和缓存图像,android,caching,android-volley,android-glide,Android,Caching,Android Volley,Android Glide,我不能完全相信这一点,可能是因为缺乏经验。我在服务器上有图像,我用JSON获取它们的路径以及描述和名称。我通过截击获得所有数据 private static final String TAG = "StoreActivity"; private RecyclerView shopsRecyclerView; private RecyclerView.LayoutManager layoutManager; private ArrayList<Store> stores; privat
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());
}
}
下次我打开相同的活动时,会再次发送请求并再次下载图像吗?或者它们以前是以某种方式缓存的,并且是从缓存中加载的?
当我关闭internet并打开相同的活动时,什么也没有发生,因为无法发送截击请求,并且我认为缓存的图像也没有显示。
解决我的问题的最佳方法是什么?基本上,我需要从服务器获取图像的路径,并将它们放在我的recyclerview中,但我也希望它们被缓存,这样它们就不会每次下载。我想建议您使用Glide lib,非常简单,为您的应用缓存图像,我自己也尝试过。您还可以向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);
希望这有帮助。嘿,我已经使用了Glide,但我必须以某种方式从服务器获取图像,这就是我使用截击的原因。其余的在我的问题中。:)您想获取图像吗?如果是,则必须将图像保存到服务器,然后必须获取图像的链接。你可以用改型而不是截击。达潘,我已经做了所有这些。我想知道的是,如果截取的图像,然后用Glide显示在ImageView中,是否会被缓存?下次我运行应用程序时,Glide会加载缓存的图像还是等待volley再次获取它们?我还想知道这方面的最佳实践是什么。我的朋友,我告诉过你Glide会缓存图像。Glide使用不同的磁盘缓存开始模式,您可以根据需要使用//这是不同的类型。DiskCacheStrategy.NONE不缓存任何内容DiskCacheStrategy.SOURCE仅缓存原始全分辨率图像。DiskCacheStrategy.RESULT在降低分辨率后仅缓存最终图像。DiskCacheStrategy.ALL会缓存映像的所有版本,是的,您的映像将使用Glide进行缓存。我只知道这些,兄弟。希望有帮助:)
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);