Скольжение и переосмысление, слишком много памяти - PullRequest
0 голосов
/ 03 мая 2018

Я использую Glide для загрузки изображений (~ 4 Кбайт каждый) и обзор переработчика с разметкой сетки для его отображения. Я храню изображения url в кэше lru. В onBindViewHolder () я получаю URL-адрес изображения и отображаю его с помощью Glide следующим образом:

 Glide.with(mMainActivity).load(item.getPosterPath()).thumbnail(0.5f).into(holder.posterPath);

Проблема в том, что после 300 изображений приложение выходит из памяти, исключение, это информация профайлера Android: enter image description here

Это мой переходник:

@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.
     */
}

Адаптер прокрутки моего утилита просмотра:

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

}

enter image description here

Где и когда делаются все байты []?

1 Ответ

0 голосов
/ 03 мая 2018

Я действительно не понимаю, что может происходить, но я следил за двумя вещами:

  1. Я бы посмотрел на http://bumptech.github.io/glide/int/recyclerview.html, чтобы узнать, соблюдаете ли вы их правильные методы.
  2. Я бы использовал Glide.with(holder.getContext()).load(….

Вы передаете или используете mMainActivity там, что, как я предполагаю, относится к вашему Activity. Нет абсолютно никакой необходимости ссылаться на всю активность. У вас есть представления и вы загружаете изображения в контексте представлений (ViewHolder, к которому вы привязываете), поэтому удалите эту утечку оттуда.

...