Problema ao carregar varias imagem

Bom galera, estou fazendo um app que entre outra coisas ele carrega imagens de um WebServer(que eu mesmo fiz), só que quando ele tenta carregar varias imagens, umas 15 por exemplo, ele me da um erro. Agora se carregar só 3 ou 4 imagens ai funciona.

04-30 16:46:39.350 1208-1247/br.com.mafra.webservice E/AndroidRuntime: FATAL EXCEPTION: Thread-83
                                                                       java.lang.OutOfMemoryError
                                                                           at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
                                                                           at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527)
                                                                           at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:599)
                                                                           at br.com.mafra.webservice.Conexao.Carregaimagem(Conexao.java:188)
                                                                           at br.com.mafra.webservice.Conexao.LerJson(Conexao.java:160)
                                                                           at br.com.mafra.webservice.MainActivity.PegaGet(MainActivity.java:46)
                                                                           at br.com.mafra.webservice.MainActivity$1.run(MainActivity.java:35)
                                                                           at java.lang.Thread.run(Thread.java:856)

acredito que seja falta de memoria para carregar todas as imagens, as imagens em se elas são pequenas tem por volta de 100KB mas com uma resolução média de 1500x1500, tem alguma forma de eu carregar varias imagens no app sem sobrecarregar a memoria? ou não tem jeito, vou ter que diminuir a resolução das imagens no server antes de mandar para o app?

leandro,

Para evitar esse problema, você deve fazer o download imagem por imagem.

me1 Bom Dia.

Só que meu app já faz dessa forma, as imagem elas são exibidas num ListView, e quando eu vou criar o List que irei passar para o Adapter faço isso usando um laço FOR e a cada volta desse laço ele carrega uma imagem, vou mostrar como isso esta funcionando.

MainActivity.class

private ListView viewlist;
private List<AuxAdapter> listaadap = new ArrayList<AuxAdapter>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

   ... código ...

    viewlist = (ListView) findViewById(R.id.viewlista);

    new Thread(new Runnable() {
        @Override
        public void run() {
            PegaGet();
        }
    }).start();
}

public void PegaGet(){
    try {
        Conexao cx = new Conexao();
        String json = cx.Conec("get",0, null, null, null, false); //<= aqui ele só retorna um Json em forma de String

        listaadap = null;
        listaadap = cx.LerJson(json);

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                AdapterLista ad = new AdapterLista(contesto, listaadap, ma);//<= contesto = Context ; ma = é um objeto do MainActivity 
                viewlist.setAdapter(ad);
            }
        });
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Conexao.class

public List<AuxAdapter> LerJson(String json){
    List<AuxAdapter> li = new ArrayList<AuxAdapter>();
    try {
        JSONObject jo = new JSONObject(json);
        JSONArray ja = jo.getJSONArray("lista");

        for(int i = 0 ; i < ja.length() ; i++ ){
            AuxAdapter adp = new AuxAdapter();
            jo = null;
            jo = ja.getJSONObject(i);

            adp.setId(jo.getInt("id"));
            adp.setNome(jo.getString("nome"));
            adp.setDescricao(jo.getString("descricao"));
            adp.setValor(jo.getDouble("valor"));
            adp.setImagem(Carregaimagem(jo.getInt("id")));
            adp.setNomeDoArquivo(jo.getString("nomeDoArquivo"));
            adp.setTipo(jo.getString("tipo"));

            li.add(adp);

        }

    } catch (JSONException e) {
        li.clear();
        e.printStackTrace();
    }

    return li;
}

public Bitmap Carregaimagem(int id){
    Bitmap ima = null;
    HttpURLConnection co = null;
    try{
        URL url = new URL("http://192.168.0.105:8080/WebServiceAppMaven/androidima/"+id);
        co = (HttpURLConnection) url.openConnection();
        co.setUseCaches(false);
        co.setDoInput(true);
        //co.setDoOutput(false);
        co.setRequestMethod("GET");
        co.connect();
        InputStream in = co.getInputStream();
        ima = BitmapFactory.decodeStream(in);
    }catch (IOException e){
        e.printStackTrace();
    }finally {
        co.disconnect();
    }
    return ima;
}

Obs.: Conseguir resolver esse problema em parte, eu reduzir a resolução da imagem no próprio Server antes de manda- la para o Android, isso funcionou, mas eu queria saber se existe uma solução aplicável no próprio Android? para caso se eu não tive-se acesso ao código do server.

Amigo procure usar libs para carregar imagens como o Glide ou picasso, e para consumir via web service use o Retrofit e evite sérios problemas de out of memory e alem de ganhar uma série de recursos extras e performance.

Leandro,

Não tinha visto sua resposta.
Se você ainda não tiver resolvido o problema, faça o seguinte, usa a biblioteca do picasso para resolver o seu problema:

private void Carregaimagem(String url, ImageView imageView) {
Picasso.with(mContext).load(url).into(imageView);
}

Dessa forma o seu método fica enxuto, confiável e performático, ou seja, a biblioteca vai fazer 99,9% do trabalho pra você, a única coisa que você precisa passar pra biblioteca é o contexto, a url e a Imageview.

Lembrando que para usar essa biblioteca você precisa declarar a dependência no seu build.gradle da seguinte forma:

compile ‘com.squareup.picasso:picasso:2.5.2’

Qualquer dúvida posta aí que agente resolve.

Até mais.

Pedrosa e me1

Valeu gente era esse tipo de recurso que eu estava procurando, nesse caso já que era eu que estava fazendo tudo então conseguir dar um jeito, mas já que nem sempre temos esse privilégio, é bom conhecer uma lib que resolva esse tipo de problema do lado mobile, e tendo que fazer só 0,1% do trabalho me sobra mais tempo e energia para fazer o resto do código, pra esse projeto eu já terminei mas com certeza vou anotar essas libs para qualquer projeto futuro que for necessário.