0 votos

tengo el siguiente error: Out of memory on a 1048592-byte allocation. Estoy utilizando un recyclerview para mostrar mis imagenes pero error me saca de la aplicación.

El código que indicas en que parte lo debo colocar ya que tengo el siguiente código:

private List<BaseAmigos> listBaseAmigos;

private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;

private RequestQueue requestQueue;
private int requestCount = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_amigos);
    MultiDex.install(this);

    recyclerView = (RecyclerView) findViewById(R.id.amigos);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    listBaseAmigos = new ArrayList<>();
    requestQueue = Volley.newRequestQueue(this);

    getData();

    recyclerView.addOnScrollListener(rVOnScrollListener);

    adapter = new CardAdapterPetFriends (listBaseAmigos, this);

    recyclerView.setAdapter(adapter);


private JsonArrayRequest getAmigos(int requestCount) {

    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar1);

    progressBar.setVisibility(View.VISIBLE);
    setProgressBarIndeterminateVisibility(true);

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL_INFO_PETF + String.valueOf(requestCount),
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {

                    parseData(response);

                    progressBar.setVisibility(View.GONE);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressBar.setVisibility(View.GONE);
                    Toast.makeText(PetFriends.this, "No hay mas Información", Toast.LENGTH_SHORT).show();
                }
            });
    return jsonArrayRequest;
}

private void getData() {
    requestQueue.add(getAmigos(requestCount));
    requestCount++;
}

private void parseData(JSONArray array) {
    for (int i = 0; i < array.length(); i++) 
        BaseAmigos baseAmigos = new BaseAmigos();
        JSONObject json = null;
        try {
            json = array.getJSONObject(i);

            //Adición de datos al objeto de Base Amigos
            baseAmigos.setId(json.getString(Config.TAG_ID_PETF));
            baseAmigos.setImagenUrl(json.getString(Config.TAG_IMG_PETF));
            baseAmigos.setNombre(json.getString(Config.TAG_PET_FRIENDS));
            baseAmigos.setDescrip(json.getString(Config.TAG_DESCR_PETF));
            baseAmigos.setTelefono(json.getString(Config.TAG_TEL_PETF));
            baseAmigos.setHora(json.getString(Config.TAG_HORARIO_PETF));
            baseAmigos.setDireccion(json.getString(Config.TAG_DIR_PETF));

        } catch (JSONException e) {
            e.printStackTrace();
        }
        //Añadiendo el objeto de Base Clientes a la lista
        listBaseAmigos.add(baseAmigos);
    }

    //Notificar al adaptador que los datos se han añadido o modificado
    adapter.notifyDataSetChanged();
}

//Este método sería comprobar que el desplazamiento recyclerview ha tocado fondo o no
private boolean isLastItemDisplaying(RecyclerView recyclerView) {
    if (recyclerView.getAdapter().getItemCount() != 0) {
        int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
        if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
            return true;
    }
    return false;
}

private RecyclerView.OnScrollListener rVOnScrollListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (isLastItemDisplaying(recyclerView)) {

            getData();
        }

    }
};

Agradezco la ayuda que me puedan brindar.

Gracias.

preguntado por Mario German Agudelo Jul 13, 2016 en Aplicaciones Móviles

1 Respuesta

0 votos
El error de falta de memoria ocurre cuando se le acaba la memoria asignada a tu aplicación, por lo que el sistema operativo lo finaliza. Aquí puedes ver como prevenir los problemas de memoria: https://developer.android.com/training/displaying-bitmaps/load-bitmap.html y como cachear las imagenes: https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
respondido por Ramon [Admin] Jul 25, 2016