在两个单独的活动中使用 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,这可能不适合您的应用程序。当然可以使用商业许可证。最好提前意识到这一点!)
我有一个应用程序使用列表适配器生成项目列表,当单击我们的 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,这可能不适合您的应用程序。当然可以使用商业许可证。最好提前意识到这一点!)