【发布时间】:2014-02-23 09:18:50
【问题描述】:
我有一个活动 A(一个列表视图),它调用活动 B(一个从数据库中检索图像分配的适配器)。当用户点击 Activity A 的返回按钮时,应用返回主菜单。
问题是我仍然可以看到 Activity B 正在运行,并从数据库中获取所有数据,耗尽了宝贵的内存。
有没有办法在按下 Activity A 后退按钮时可以销毁 Activity B?
谢谢 夏兰
Activity A 是一个列表活动,它打开 DB,获取光标对象,发送到 Itemadpter 类以填充列表视图:
// get the cursor from database
ViewListOfDives.data = new diveDataBase(ViewListOfDives.this);
ViewListOfDives.data.open();
// get cursor object holding all data, use a asynch inner class to load
cursor = data.getCursorData();
//check if data available
if(cursor!=null && cursor.getCount()>0){
// get customised array adoater list
adapter = new ItemAdapter(ViewListOfDives.this, cursor);
}else{
//display o dives in data base message and finish this activity
displayDialog();
}
ViewListOfDives.this.setListAdapter(adapter);
ViewListOfDives.data.close();
编辑:CursorAdapter 类,这里的图像是从数据库中检索的,调整大小,并设置为列表视图的 ImageView .....即使 ListAcivity 已经用完大量内存,这个过程仍在继续
这一切都是在异步内部类中进行的......
public ItemAdapter(Context context, Cursor c) {
super(context, c);
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
// mContext.
// noOfRows = c.getCount()+1;//use row count to get no of dives
}//end constructor
//do in background method
//retrival of images from DB and resizing is carried out in a asynch class
String diveImagePath = imagePath[0];
File imagePathFile = new File(diveImagePath);
try {
final int IMAGE_MAX_SIZE = 3000;
FileInputStream streamIn = new FileInputStream(imagePathFile);
// Decode image size and setInJBounds = true to avoid auto memory allocation for large image
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(streamIn, null, o);
streamIn.close();
int scale = 1;
while ((o.outWidth * o.outHeight) * (1 / Math.pow(scale, 2)) >
IMAGE_MAX_SIZE) {
scale++;
}
//get orginal width of image before loaded into memory
Log.d(TAG, "scale = " + scale + ", orig-width: " + o.outWidth + " orig-height: " + o.outHeight);
Bitmap b = null;
streamIn = new FileInputStream(imagePathFile);
if (scale > 1) {
scale--;
// scale to max possible inSampleSize that still yields an image
// larger than target, inSampleSize loads the image into memor by a factor of its integer value
o = new BitmapFactory.Options();
o.inSampleSize = scale;
// Decode bitmap with inSampleSize set
o.inJustDecodeBounds = false;
b = BitmapFactory.decodeStream(streamIn, null, o);
resizedImage = reSizeImage(b);
streamIn.close();
b.recycle();
System.gc();
} else {
bitmap = BitmapFactory.decodeStream(streamIn);
resizedImage = reSizeImage(bitmap);
streamIn.close();
System.gc();
}
@Override
protected void onPostExecute(Bitmap bitmap) {
ImageView displayImage = (ImageView) view.findViewById(R.id.iv_list_image);
if(bitmap!=null){
displayImage.setBackground(null);
//resizedImage = reSizeImage(bitmap);
displayImage.setImageBitmap(resizedImage);
}else{
//Toast.makeText(context, "No Image Found!! Usimng default", Toast.LENGTH_LONG).show();
displayImage.setBackgroundResource(R.drawable.logdive3);
}
编辑:此代码有效: 取消 ListActivity 异步任务(依次调用 CursorAdpter ayscnh 任务以从数据库加载图像),并获取 CursorAdtpter aysnch 任务引用并取消此任务.....
//in the ListActivity class
@Override
public void onBackPressed() {
// try to quit cursoradpter from reriving and upload data when user clicks back button
super.onBackPressed();
//cancel the background process of asycn task
getCursorAysnch.cancel(true);
//now cancel backgound process of Itemadatpetr class to free memory and stop loading images from DB
adapter.getImageAsynch.cancel(true);
Log.d("Vuiew List Dives:", "Back button pressed");
【问题讨论】:
-
B 是一个活动还是一个适配器类??
-
B 是一个 cursoradapter 类......
-
为什么不通过适配器的上下文完成活动..
-
在onBackPressed方法中,调用super.onBackPressed和finish(),如果是适配器类,可以做((ActivityB)context).finish();
-
所以看到这个停止 AsyncTask 线程:stackoverflow.com/questions/7821284/…
标签: android android-activity lifecycle