estou tendo um problema serio, estou fazendo download via aplicação de um numero considerável de imagens tipo umas 5000 imagens de varias dimensões todas. eu começo a baixar tá tudo tranquilo, quando eu chego em torno da imagem 1800 eu estouro o heap size do aparelho. pesquisando pela nela testei algumas soluções e vi na documentação do Android falando do Option implementando o inSampleSize, porem essa variavel diminui o tamanho da imagem, como estou usando Bitmap, já chamei o recycle(), já chamei o system.gc(), chamei os dois juntos tb, e não consigo achar uma forma de limpar o heap do aparelho para cada download, não me atenderia dimininuir o tamanhdo da imagem sendo que eu vou precisar dela do tamanho que ela é .
o problema se dá nessa ultima linha;
ByteArrayInputStream is = new ByteArrayInputStream(tempOut.toByteArray());
// BitmapFactory.Options options = new BitmapFactory.Options();
// options.inSampleSize = 1;
Bitmap myBitmap = BitmapFactory.decodeStream(is);
Utilize um profiler para identificar o seu gargalo. Lembre sempre de limpar as instancias que você esta carregando as imagens para evitar que elas fiquem em memoria.
Fiz um post a alguns dias sobre como resolvi um memory leak bem cabreiro… você pode ver aqui: www.jemiliod.blogspot.com
E
entanglement
ByteArrayInputStream is = new ByteArrayInputStream(tempOut.toByteArray());
Bitmap myBitmap = BitmapFactory.decodeStream(is);
Depois de você usar o ByteArrayInputStream, você o fecha (método close()) ?
O Garbage Collector não fecha tudo tão rapidamente quanto você quer. Se algo é aberto, deve ser fechado o mais rapidamente possível após o uso.
fabriciov
Em uma aplicação de camera ocorria o outOfMemory algumas vezes, diminui bem a ocorrencia utilizando o recycle, setando null para qualquer byte array utilizado e por fim chamando o gc.
Ja tentou gerar a bitmap direto do byteArray ?
danilorangelmg
Já tentei sim, ocorre a mesma coisa
Marky.Vasconcelos
Destruiu também as Views que voce as exibe? Setando images para null, recycle nos Bitmaps e setCallback(null) em Drawables?
danilorangelmg
Entao mark eu não as exibo eu faço o download e salvo no sd,
olha o codigo abaixo
System.out.println("Downloading: "+imageURL);HttpClienthttpClient=newDefaultHttpClient();HttpGethttpGet=newHttpGet(URI.create(imageURL));//recebe a respostaHttpResponsehttpResponse=httpClient.execute(httpGet);if(httpResponse.getStatusLine().getStatusCode()>=400){thrownewException("Erro ao baixar imagem do servidor."+httpResponse.getStatusLine().getStatusCode());}HttpEntityresponseEntity=httpResponse.getEntity();InputStreaminput=responseEntity.getContent();byte[]buffer=newbyte[1024];intsizeRead;ByteArrayOutputStreamtempOut=newByteArrayOutputStream();while((sizeRead=input.read(buffer))!=-1){tempOut.write(buffer,0,sizeRead);}tempOut.flush();tempOut.close();ByteArrayInputStreamis=newByteArrayInputStream(tempOut.toByteArray());// BitmapFactory.Options options = new BitmapFactory.Options();// options.inSampleSize = 1;BitmapmyBitmap=BitmapFactory.decodeStream(is);// Bitmap myBitmap = BitmapFactory.decodeStream(is, null, options);is.close();FilenFile=null;if(myBitmap!=null){//verifica se o path padrao das imagens foi criadoStringpath=App.IMAGE_PATH;Filedir=newFile(path+"/image");//se não existir cria o diretorioif(!dir.exists()){dir.mkdir();}//a partir daqui a imagem é salva no diretorionFile=newFile(dir.getAbsolutePath(),fileName);createThumb(nFile,myBitmap);compressBitMap(myBitmap,nFile);myBitmap=null;System.gc();============================================privatevoidcompressBitMap(BitmapmyBitmap,FilenFile)throwsFileNotFoundException,IOException{OutputStreamfOut=newFileOutputStream(nFile);myBitmap.compress(Bitmap.CompressFormat.JPEG,85,fOut);fOut.flush();fOut.close();myBitmap.recycle();}privatevoidcreateThumb(Filefile,Bitmapmap){try{// load the origial BitMap (500 x 500 px)intwidth=map.getWidth();intheight=map.getHeight();intnewWidth=40;intnewHeight=40;if(App.SDK_VERSION>=13){newWidth=100;newHeight=100;}// calculate the scale - in this case = 0.4ffloatscaleWidth=((float)newWidth)/width;floatscaleHeight=((float)newHeight)/height;// createa matrix for the manipulationMatrixmatrix=newMatrix();// resize the bit mapmatrix.postScale(scaleWidth,scaleHeight);// recreate the new BitmapBitmapresizedBitmap=Bitmap.createBitmap(map,0,0,width,height,matrix,true);StringpathThumb=file.getParent()+"/thumb";FiletFile=newFile(pathThumb);if(!tFile.exists()){tFile.mkdir();}tFile=newFile(tFile.getAbsolutePath()+"/"+file.getName());compressBitMap(resizedBitmap,tFile);}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}
Marky.Vasconcelos
Acredito que sejam as streams então.
danilorangelmg
como assim?
A
A_H_Gusukuma
Olá
Já verificou se as 5000 imagens cabem no celular?
Já tentou retomar os dowloads a partir da última imagem baixada?
Marky.Vasconcelos
Por exemplo, sempre chame consumeContent() de HttpResponses e chame close() em Input/OutputStreams.
fabriciov
Se você vai apenas salvar não há necessidade de criar bitmaps (o que se deve evitar ao máximo por ser muito pesado).
mais apesar que se eu garantir que a imagem seja jpg do lado do servidor eu nao preciso comprimir ela.
danilorangelmg
Galera aparentemente eu resolvi. retirei todos os bitmaps do metodos e salvei direto com o FileOutput e funcionou, resolvi garantir que a imagens vai chegar do jeito que eu preciso do lado do servidor.