2015-03-26 2 views
0

У меня есть приложение, которое использует адаптер списка, чтобы создать список элементов, которые при нажатии на нас Mupdf для просмотра элемента (в формате PDF)Usingt Mupdf и представление списка в двух отдельных мероприятиях, в конечном счете исчерпывает память

Если я подпрыгиваю назад и вперед между представлениями, у меня в конечном итоге закончится память и сбой. Как я могу убедиться, что каждое представление начинается с максимально возможной памяти, чтобы я не разбивал приложение.

список вид адаптера довольно прост:

public class PosterListAdapter extends BaseAdapter { 

     private final ArrayList<Poster> listItems; 
     private final ArrayList<PosterCategory> categoryList; 

     private final LayoutInflater inflater; 

     public PosterListAdapter(ArrayList<Poster> listItems, ArrayList<PosterCategory> categoryItems, LayoutInflater inflater) { 
      this.listItems = listItems; 
      this.categoryList = categoryItems; 
      this.inflater = inflater; 
     }  


     @Override 
     public int getCount() { 
      //Log.d("getCount", String.valueOf(this.listItems.size())); 
      return this.listItems.size();    
     } 

     @Override 
     public Poster getItem(int i) { 

      return this.listItems.get(i); 
     } 

     public PosterCategory getCItem(int i){ 

      return this.categoryList.get(i); 
     } 

     @Override 
     public long getItemId(int i) { 
      return 0; 
     } 

     @Override 
     public View getView(int i, View view, ViewGroup viewGroup) { 

      if (view == null) { 
       view = inflater.inflate(R.layout.catalog_list_fragment, viewGroup, false); 
      } 
      TextView posterTitle = ((TextView) view.findViewById(R.id.poster_title)); 
      TextView posterAuthor = ((TextView) view.findViewById(R.id.poster_author)); 
      TextView posterSynopsis = ((TextView) view.findViewById(R.id.poster_synopsis)); 
      TextView posterCategory = ((TextView) view.findViewById(R.id.poster_category)); 
      TextView posterNumber = ((TextView) view.findViewById(R.id.poster_number)); 
      ImageView imageView = ((ImageView) view.findViewById(R.id.poster_thumb)); 

      //LayoutParams params = (LayoutParams) imageView.getLayoutParams(); 

      Poster item = this.listItems.get(i); 

      String filename = item.getPosterFilename(); 
      posterAuthor.setText(item.getPresenterFname()+' '+item.getPresenterLname()); 
      posterTitle.setText(item.getPosterTitle()); 
      posterSynopsis.setText(item.getPosterSynopsis()); 
      posterNumber.setText("Poster: "+String.valueOf(item.getPosterNumber())); 

      //Log.d("PosterNumber", String.valueOf(item.getPosterNumber())); 

      int catId = item.getCatID(); 

      posterCategory.setText(getCategoryById(categoryList, catId)); 

      File imgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(), filename+".png"); 
      //File imgFile = getBaseContext().getFileStreamPath(filename+".png"); 

      Bitmap bmp = BitmapFactory.decodeFile(imgFile.toString()); 
      //int newWidth = 500; 
      //Bitmap sizedBMP = getResizedBitmap(bmp, newWidth); 

      imageView.setImageBitmap(bmp); 

      return view; 
     } 
    } 

ответ

0

Наиболее вероятным объяснением является то, что вы утечка памяти где-то.

Хотя Java выполняет довольно хорошую работу по восстановлению памяти, принадлежащей исключительно Java-коду (используя Garbage Collection), MuPDF выполняет большую часть своей работы на C. Это означает, что необходимо позаботиться о том, чтобы вызвать API MuPDF в правильном способ избежать утечек.

Вы не предоставили нам достаточно информации в своем вопросе, чтобы узнать, как вы звоните в MuPDF, поэтому проверить ваш код на разумность невозможно.

(Кроме того, перед тем, как вы приступите к проекту, использующему MuPDF, убедитесь, что вы прочитали и поняли условия лицензии. Единственной бесплатной лицензией для MuPDF является GNU APGL, и это может быть непригоден для вашего приложения. Конечно, лицензии доступны. Лучше это реализовать!)

Смежные вопросы