当前位置:编程学习 > wap >>

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

当滑动五六个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();
}
}
}





--------------------编程问答--------------------
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();
}
}

}
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,