在两个单独的活动中使用 Updf 和列表视图最终会耗尽内存

Usingt Mupdf and a list view in two seperate activities eventually runs out of memory

我有一个应用程序使用列表适配器生成项目列表,当单击我们的 Mupdf 查看项目时(pdf)

如果我在视图之间来回跳转,我最终会 运行 内存不足并崩溃。我如何确保每个视图都以尽可能多的内存启动,以免应用程序崩溃。

列表视图适配器非常简单:

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;
        }
    }

最可能的解释是您在某处泄漏了内存。

虽然 Java 在恢复完全由 Java 代码拥有的内存方面做得很好(使用垃圾收集),但 MuPDF 的大部分工作都是在 C 中完成的。这意味着需要注意以正确的方式调用 MuPDF API 以避免泄漏。

您在问题中没有向我们提供足够的信息来了解您是如何调用 MuPDF 的,因此实际上不可能检查您的代码是否完整。

(此外,在您开始使用 MuPDF 的项目之前,请确保您已阅读并理解许可条款。MuPDF 的唯一免费许可是 GNU APGL,这可能不适合您的应用程序。当然可以使用商业许可证。最好提前意识到这一点!)