我使用 Glide 下载图像(每个约 4Kb)和一个带有网格布局的 recyclerview 来显示它。我将图像 url 存储在 lru 缓存中。在 onBindViewHolder() 中,我获取图像 url 并使用 Glide 显示它,如下所示:
Glide.with(mMainActivity).load(item.getPosterPath()).thumbnail(0.5f).into(holder.posterPath);
问题是,在 300 张图像后,应用程序进入内存不足异常,这是 Android 分析器信息:
这是我的 recyclerview 适配器:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_content, parent, false));
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
Item item = mItems.get(position);
if (item!= null) {
holder.itemView.setTag(item);
Glide.with(mMainActivity).load(item.getPosterPath()).apply(ro).thumbnail(0.5f).into(holder.posterPath);
holder.itemView.setOnClickListener(mOnClickListener);
}
}
class ViewHolder extends RecyclerView.ViewHolder {
private ImageView posterPath;
private TextView originalName;
ViewHolder(View view) {
super(view);
posterPath = itemView.findViewById(R.id.poster);
}
}
这是我的结构:
public static LruCache<Integer, Item> mItemMap = new LruCache<>(20);
项目在哪里:
public class Item {
private String mId;
private String mOriginalName;
private String mFirstAirDate;
private String mLanguage;
private String mOverview;
private String mPosterPath;
private int itemPos;
Item(String id, String originalName, String firstAirDate, String language, String posterPath, String overview, int itemPos) {
this.mId = id;
this.mOriginalName = originalName;
this.mFirstAirDate = firstAirDate;
this.mLanguage = language;
this.mOverview = overview;
this.mPosterPath = posterPath;
this.itemPos = itemPos;
}
/**
* Getters.
*/
}
我的 recyclerview 滚动适配器:
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mGridLayoutManager.getItemCount();
firstVisibleItem = mGridLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
current_page++;
onLoadMore(current_page);
loading = true;
}
}
这就是我从互联网获取新数据的方式:
public void newItem() {
currentPage++;
String URL = "myurl";
RestClient.get(URL, null, mHandler);
}
mHandler 在哪里:
mHandler = new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
results = (JSONArray) response.get("results");
for (int i = 0; i < results.length(); i++) {
obj = results.getJSONObject(i);
id = obj.get("id").toString();
posterPath = obj.get("poster_path").toString();
if (!posterPath.equals("null")) {
mItem.add(ItemList.createItem(id, null, null, null, POSTER_BASE_URL+posterPath, null, itemPos));
itemPos++;
}
}
notifySubscriber();
} catch (JSONException e) {
Log.d("JSON", "Error in parsing json.");
}
}
};
这是我的 RestClient:
private static AsyncHttpClient client = new AsyncHttpClient();
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
}
所有 byte[] 分配是在何时何地进行的?
最佳答案
我真的不知道会发生什么,但我会注意两件事:
Glide.with(holder.getContext()).load(…
. 您正在传递或使用
mMainActivity
也就是说,我假设您的 Activity
.绝对没有必要在那里引用整个 Activity。你有 View 并且你在 View 的上下文中加载图像(你绑定(bind)的 ViewHolder),所以从那里删除那个泄漏。
关于android - Glide和recyclerview,内存太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50163042/