画像を含む特定のフラグメントがあります。画像をクリックすると、画像が拡大され、タイトル付きのダイアログに表示されます。
これはすべて正常に機能します。
DDMS を使用しているときに、ダイアログ ボックスを開いたときと解放されていないダイアログ ボックスを閉じたときに、ヒープ メモリが最大 4Mb 増加するのを見ました。
したがって、これを数回行うと、巨大なヒープメモリが必要になります。
public class ImageOnClickListener implements OnClickListener {
String article_title ;
String article_url;
public ImageOnClickListener(String imageUrl, String title) {
article_title = title;
article_url = imageUrl;
}
@Override
public void onClick(View v) {
View layout = null;
AlertDialog.Builder imageDialog = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = inflater.inflate(R.layout.image_fragment, null);
TextView articleTitle = (TextView)layout.findViewById(R.id.image_title);
articleTitle.setText(article_title);
articleTitle.setTextSize(MainActivity.fontSize +10);
articleTitle.setTextColor(getResources().getColor(
android.R.color.white));
URL imageUri = null;
try {
imageUri = new URL(article_url);
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
Bitmap bitmapImage = null;
try {
bitmapImage = BitmapFactory.decodeStream(imageUri.openConnection().getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
int width = display.getWidth(); // deprecated
int height = display.getHeight();
int w = (int) (width*0.8);
int h = (int) (height*0.8);
ImageView imageObject = (ImageView)layout.findViewById(R.id.image_main);
int imgWidth = bitmapImage.getWidth();
int imgHeight = bitmapImage.getHeight();
int ratio = w/imgWidth;
Bitmap.createScaledBitmap(bitmapImage, imgWidth*ratio,imgHeight*ratio, true);
imageObject.setImageBitmap(bitmapImage);
RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(w,h);
imageObject.setLayoutParams(imageParams);
alertDialog = imageDialog.setView(layout).create();
int dialogWidth = (int) (width*0.9);
int dialogHeight = (int) (height*0.9);
alertDialog.show();
alertDialog.getWindow().setLayout(dialogWidth,dialogHeight);
}
}
基本的に、ダイアログを閉じるときにそのメモリを解放する方法を探していました。