我有一个活动A(一个列表视图),它调用活动B(一个从数据库检索图像分配的适配器)。当用户点击活动A的返回按钮时,该应用程序返回到主菜单。当另一个活动停止时销毁活动
问题是我仍然可以看到活动B正在运行并从数据库中获取所有数据,使用了有价值的内存。
活动A后退按钮被按下时是否有办法我可以销毁活动B?
感谢 夏兰
活性A被打开数据库,获取光标对象名单的活动,发送到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是一个活动或一个适配器类? – Ranjit
B是一个cursoradapter类...... – dancingbush
为什么不通过你的上下文从你的适配器完成活动.. – Ranjit