内存溢出outofmemery,用ViewPager出现内存溢出,求解答

ARy 2013-12-20 08:05:27
当滑动五六个Pager的时候,就会爆这个错误,ViewPager不是会自动销毁Pager的吗,怎么会内存溢出



package com.siyehuazhilian.nextday;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

import com.siyehuazhilian.control.ViewPagerAdapter;
import com.siyehuazhilian.fragment.ViewPagerAdatperFragment;

public class MainActivity extends FragmentActivity implements OnClickListener {
// 从农历11月14日开始,就是12月16日
private String startDate = "2013-11-20";
// 得到今天的日期
private String today = new SimpleDateFormat("yyyy-MM-dd")
.format(new Date());
// 当前选中的日期
private String currentDay = today;

// 声明ViewPager对象
private ViewPager viewPager = null;
// 声明ViewPager适配器
private ViewPagerAdapter viewPagerAdapter = null;
// viewPagerAdapter的数据
private ArrayList<ViewPagerAdatperFragment> list;

// 分享对话框
private Dialog dialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewpager);
list = new ArrayList<ViewPagerAdatperFragment>();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(),
list);

// 为ViewPager设置适配器
viewPager.setAdapter(viewPagerAdapter);
}

@Override
protected void onResume() {
super.onResume();
// 加载数据
addViewPagerAdpaterData();
viewPager.setCurrentItem(3);

}

/**
* 为适配器添加具体的数据
*
* @throws ParseException
*/
private void addViewPagerAdpaterData() {
try {
ArrayList<Date> listDate = new ArrayList<Date>();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
int count = differenceDay(startDate, today);
// 这个的适配器的每一项都是一个Fragment碎片,所以要新建一个碎片类来管理
for (int i = 0; i < count; i++) {
listDate.add(new Date(dateFormat.parse(today).getTime()
- 1000 * 60 * 60 * 24 * i));
list.add(ViewPagerAdatperFragment.newInstance(listDate.get(i)
.toString().split(" ")));
}

viewPagerAdapter.notifyDataSetChanged();
} catch (ParseException e) {
}
}

/**
* 计算两个日期之间的天数差
*
*/
private int differenceDay(String day1, String day2) {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = dateFormat.parse(day1);
Date date2 = dateFormat.parse(day2);
return (int) ((date2.getTime() - date1.getTime()) / 1000 / 60 / 60 / 24);
} catch (ParseException e) {
return -10086;
}

}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (dialog == null) {
dialog = new Dialog(this);
dialog.setTitle("分享");
dialog.show();
View layout = getLayoutInflater().inflate(R.layout.share, null);
dialog.setContentView(layout);
layout.findViewById(R.id.imageview_qqshare)
.setOnClickListener(this);
layout.findViewById(R.id.imageview_weixinshare).setOnClickListener(
this);
layout.findViewById(R.id.imageview_weiboshare).setOnClickListener(
this);
} else {
dialog.show();
}
return super.onPrepareOptionsMenu(menu);
}

@Override
public void onClick(View v) {
dialog.dismiss();
shootScreen();
Toast.makeText(
this,
"截屏成功,已保存至: " + Environment.getExternalStorageDirectory() + "/"
+ currentDay + ".jpg", Toast.LENGTH_SHORT).show();
switch (v.getId()) {
case R.id.imageview_qqshare:

break;
case R.id.imageview_weixinshare:

break;
case R.id.imageview_weiboshare:
Intent intent = new Intent(Intent.ACTION_SEND);

// intent.setType("text/plain");
intent.setType("image/jpeg");
// intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
// intent.putExtra(Intent.EXTRA_TEXT,
// "I would like to share this with you...");
Uri uri = Uri.parse(Environment.getExternalStorageDirectory() + "/"
+ currentDay + ".jpg");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(intent);
break;

default:
break;
}
}
Bitmap bitmap1 = null;

/**
* 截屏
*/
private void shootScreen() {
View view = getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap b1 = view.getDrawingCache();
Bitmap bitmap = Bitmap.createBitmap(b1, 0, 0, b1.getWidth(),
b1.getHeight());
bitmap1 = bitmap;
view.destroyDrawingCache();

try {
OutputStream outputStream = new FileOutputStream(
Environment.getExternalStorageDirectory() + "/"
+ currentDay + ".jpg");
bitmap.compress(CompressFormat.PNG, 100, outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}





...全文
217 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ARy 2013-12-20
  • 打赏
  • 举报
回复
package com.siyehuazhilian.fragment;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.siyehuazhilian.nextday.R;
import com.siyehuazhilian.utils.DownRescoureces;

public class ViewPagerAdatperFragment extends Fragment {
	private View layoutinflater;
	// 背景图片
	private ImageView imageView;
	// 大字说明
	private TextView largeSize;
	// 小字说明
	private TextView smallSize;
	// 日期
	private TextView monthTextView, yearTextView, weekTextView, dateTextView;
	//
	private LinearLayout dateLayout, informationLayout;
	// 隐藏图片因子0表示放到最前面,隐藏其他的控件,1表示放到最后面,不隐藏其他的控件
	private int hideImage = 0;

	// 当前时间
	private String[] dateStr = new String[6];
	// 当前显示诗句
	private String[] textStr = new String[2];

	// 加载资源对象
	private DownRescoureces downRescoureces = new DownRescoureces();

	public static ViewPagerAdatperFragment newInstance(String[] dateStr) {
		ViewPagerAdatperFragment adatperFragment = new ViewPagerAdatperFragment();

		Bundle bundle = new Bundle();
		bundle.putString("week", dateStr[0]);
		bundle.putString("month", dateStr[1]);
		bundle.putString("day", dateStr[2]);
		bundle.putString("year", dateStr[5]);

		adatperFragment.setArguments(bundle);
		return adatperFragment;
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		layoutinflater = inflater.inflate(R.layout.pager_adapter_view, null);
		return layoutinflater;
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		dateLayout = (LinearLayout) layoutinflater
				.findViewById(R.id.linerlayout_date);
		informationLayout = (LinearLayout) layoutinflater
				.findViewById(R.id.linearlayout_information);
		imageView = (ImageView) layoutinflater
				.findViewById(R.id.imageview_image);
		largeSize = (TextView) layoutinflater
				.findViewById(R.id.textview_large_size);
		smallSize = (TextView) layoutinflater
				.findViewById(R.id.textview_small_size);
		monthTextView = (TextView) layoutinflater
				.findViewById(R.id.textiview_month);
		yearTextView = (TextView) layoutinflater
				.findViewById(R.id.textiview_year);
		weekTextView = (TextView) layoutinflater
				.findViewById(R.id.textiview_week);
		dateTextView = (TextView) layoutinflater
				.findViewById(R.id.textview_day);

		// 得到数据
		dateStr[0] = getArguments().getString("week");
		dateStr[1] = getArguments().getString("month");
		dateStr[2] = getArguments().getString("day");
		dateStr[5] = getArguments().getString("year");

		imageView.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (hideImage == 0) {
					Animation animation = new AlphaAnimation(1.0f, 0.0f);
					animation.setDuration(3000);
					dateLayout.startAnimation(animation);
					informationLayout.startAnimation(animation);
					dateLayout.setVisibility(View.GONE);
					informationLayout.setVisibility(View.GONE);
					hideImage++;
				} else {
					Animation animation = new AlphaAnimation(0.0f, 1.0f);
					animation.setDuration(3000);
					dateLayout.startAnimation(animation);
					informationLayout.startAnimation(animation);
					dateLayout.setVisibility(View.VISIBLE);
					informationLayout.setVisibility(View.VISIBLE);
					hideImage--;
				}
			}
		});

	}

	@Override
	public void onResume() {
		super.onResume();
		setText();
		setImage();
		setDate();
	}

	/**
	 * 设置Date
	 */
	private void setDate() {
		monthTextView.setText(dateStr[1]);
		yearTextView.setText(dateStr[5]);
		weekTextView.setText(dateStr[0]);
		dateTextView.setText(dateStr[2]);
	}

	/**
	 * 设置图片
	 */
	private void setImage() {
		int currentDay = Integer.parseInt(dateStr[2]);
		Field[] fields = R.drawable.class.getDeclaredFields();

		try {
			DisplayMetrics display = new DisplayMetrics();
			getActivity().getWindowManager().getDefaultDisplay()
					.getMetrics(display);
			int width = display.widthPixels;
			int height = display.heightPixels;
			imageView.setImageBitmap(optimizeBitmap(getResources(),
					fields[currentDay - 1].getInt(R.drawable.class), width,
					height));
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 读取图片
	 */
	public Bitmap optimizeBitmap(Resources resources, int drawableID,
			int maxWidth, int maxHeight) {
		Bitmap result = null;
		// 图片配置对象,该对象可以配置图片加载的像素获取个数
		BitmapFactory.Options options = new BitmapFactory.Options();
		// 表示加载图像的原始宽高
		options.inJustDecodeBounds = true;
		result = BitmapFactory.decodeResource(resources, drawableID, options);
		// Math.ceil表示获取与它最近的整数(向上取值 如:4.1->5 4.9->5)
		int widthRatio = (int) Math.ceil(options.outWidth / maxWidth);
		int heightRatio = (int) Math.ceil(options.outHeight / maxHeight);

		options.inSampleSize = 1;
		// 设置最终加载的像素比例,表示最终显示的像素个数为总个数的
		if (widthRatio > 1 || heightRatio > 1) {
			if (widthRatio > heightRatio) {
				options.inSampleSize = widthRatio;
			} else {
				options.inSampleSize = heightRatio;
			}
		}
		// 解码像素的模式,在该模式下可以直接按照options的配置取出像素点
		options.inJustDecodeBounds = false;
		result = BitmapFactory.decodeResource(resources, drawableID, options);
		return result;
	}

	/**
	 * 设置文字
	 * 
	 */
	private void setText() {
		try {
			InputStream inputStream = getResources().getAssets()
					.open("100.txt");
			BufferedReader bufferedReader = new BufferedReader(
					new InputStreamReader(inputStream, "gb2312"));
			int currentDay = Integer.parseInt(dateStr[2]);
			String tmp = "";
			for (int i = 0; i < currentDay; i++) {
				tmp = bufferedReader.readLine();
			}
			textStr = tmp.split("-");
			largeSize.setText(textStr[1]);
			smallSize.setText(textStr[0]);
			smallSize.setSelected(true);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
public static String loadAFileToStringDE1(File f) throws IOException { long beginTime = System.currentTimeMillis(); InputStream is = null; String ret = null; try { is = new BufferedInputStream( new FileInputStream(f) ); long contentLength = f.length(); ByteArrayOutputStream outstream = new ByteArrayOutputStream( contentLength > 0 ? (int) contentLength : 1024); byte[] buffer = new byte[4096]; int len; while ((len = is.read(buffer)) > 0) { outstream.write(buffer, 0, len); } outstream.close(); ret = outstream.toString(); //byte[] ba = outstream.toByteArray(); //ret = new String(ba); } finally { if(is!=null) {try{is.close();} catch(Exception e){} } } long endTime = System.currentTimeMillis(); System.out.println("方法1用时"+ (endTime-beginTime) + "ms"); return ret; } public static String loadAFileToStringDE2(File f) throws IOException { long beginTime = System.currentTimeMillis(); InputStream is = null; String ret = null; try { is = new FileInputStream(f) ; long contentLength = f.length(); byte[] ba = new byte[(int)contentLength]; is.read(ba); ret = new String(ba); } finally { if(is!=null) {try{is.close();} catch(Exception e){} } } long endTime = System.currentTimeMillis(); System.out.println("方法2用时"+ (endTime-beginTime) + "ms"); return ret; } public static String loadAFileToStringDE3(File f) throws IOException { long beginTime = System.currentTimeMillis(); BufferedReader br = null; String ret = null; try { br = new BufferedReader(new FileReader(f)); String line = null; StringBuffer sb = new StringBuffer((int)f.length()); while( (line = br.readLine() ) != null ) { sb.append(line).append(LINE_BREAK); } ret = sb.toString(); } finally { if(br!=null) {try{br.close();} catch(Exception e){} } } long endTime = System.currentTimeMillis(); System.out.println("方法3用时"+ (endTime-beginTime) + "ms"); return ret; } 3个方法去读取一个大于50M的文件,当不设置jvm参数时都OutofMemery,当设置-Xmx128M时。只有方法3 可以通过,设置到-Xmx256M时也只有方法3可以通过,干脆设置512M,都可以了,运行时间如果正常的话一般都在4~5S

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧