Link.fuites de mémoire applications
Maintenant, j'ai une fuite de contexte dans mon projet et sur le lien, il explique très bien tout ce qui pourrait causer. Pour être honnête j'ai essayé d'enlever autant que possible qui a des variables de contexte mais j'ai un problème avec ma vue de grille et mon adapteur de base et j'ai vraiment besoin d'aide que j'ai batté ma tête au-dessus de ceci. Parfois, il m'échappe que les ordures collectées se montrent comme un ninja sur les autres classes.
Ma question: « Qu'est-ce que les gars vous suggérer que je devrais changer? » et "Que dois-je faire attention?"
Voici ce que je faisais: 1. créé une carte Hash pour mes images étirables 2. A créé un adaptateur de base pour le gridview 3. Mon code pour la classe loadCover
Carte statique privée ImageLocator = Collections .synchronizedMap (nouveau WeakHashMap());
private class BaseA extends BaseAdapter{
private LayoutInflater inflater;
public BaseA(Context context){
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
viewHolder vh = new viewHolder();
row = inflater.inflate(R.layout.book_row_view, null);
vh.authors = (TextView)row.findViewById(R.id.book_Author);
vh.image = (ImageView)row.findViewById(R.id.icon);
vh.date = (TextView)row.findViewById(R.id.Date);
vh.Titles = (TextView)row.findViewById(R.id.Book_Title);
vh.fileName = (TextView)row.findViewById(R.id.FileLocation);
try{
String temp = File_Name.get(position);
vh.fileName.setText(temp);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
Book_Information bi;
bi = new Book_Information();
bi = dbh.getData(File_Name.get(position));
//Gets the right book information for all the items
new LoadCover(vh.image, bi).run();
if(bi.getBook_Author() != null || bi.getBook_Date() !=null || bi.getBook_Description() != null ||
bi.getBook_Title() != null){
vh.authors.setText(bi.getBook_Author());
vh.date.setText(bi.getBook_Date());
vh.Titles.setText(bi.getBook_Title());
}
return row;
}
public int getCount() {
// TODO Auto-generated method stub
return File_Name.size();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
}
private class LoadCover implements Runnable{
ImageView image; Book_Information bi;
public LoadCover(ImageView image, Book_Information bi){
this.image = image;
this.bi = bi;
}
public void run() {
// TODO Auto-generated method stub
Drawable draw = ImageLocator.get(bi.getBook_File_Name());
if(draw!=null){
image.setImageDrawable(draw);
}else{
new UpdateImages(image, bi).run();
}
draw = null;
}
}
private class UpdateImages implements Runnable{
ImageView image;
Book_Information book_info;
public UpdateImages(ImageView imageView, Book_Information bookInfo){
this.image = imageView;
this.book_info = bookInfo;
}
public void run(){
try{
Bitmap bm = getBitmap(book_info);
FastBitmapDrawable fbd = new FastBitmapDrawable(bm);
image.setImageDrawable(fbd);
ImageLocator.put(book_info.getBook_File_Name(), fbd);
bm = null;
}catch (OutOfMemoryError e) {
// TODO: handle exception
ImageLocator.clear();
}
}
}
Je ne jetai, mais passer le ImageView dans la LoadCover peut causer des problèmes lorsque vous le gardez après qu'une activité a été détruite, vous aurez toujours votre Activité en mémoire – Blundell
Dois-je le transformer en méthode? Pour qu'il soit écrasé à chaque fois sur le défilement? – sdfwer
Vous connaissez votre seule implémentation de Runnable, cela ne signifie pas qu'elle fonctionne sur son propre Thread? – Blundell