我有一个活动A(列表视图),它调用Activity B(一个从数据库中检索所有图像的适配器)。当用户单击活动A的后退按钮时,应用程序将返回主菜单。
问题是我仍然可以看到活动B正在运行并从数据库中获取所有数据,耗尽了宝贵的内存。
当按下活动A后退按钮时有没有办法我可以销毁活动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类,这里从DB中检索图像,调整大小,并设置为列表视图的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任务从DataBase加载图像),并获取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");
答案 0 :(得分:2)
确定。您正在通过适配器类在活动B中执行所有操作。所以如果你想在后面的键中停止B,那么只需在你的onBackKeyPressed方法中完成它。为此您可以尝试一些建议(因为我不知道您当前的流程)。
1:在覆盖finish()
时调用onBackKeyPressed()
。
2:在完成所有加载内容后,在适配器类中,您还可以通过当前上下文调用finish。但是在这里你必须通过转换到一个活动来做所有的事情,因为适配器不是一个活动,我们只知道活动可以完成。
Ya演员应该像Rat-a-tat-a-tat Ratatouille所说的那样,但是在你完成从数据库中获取所有东西之后再这样做,否则它会阻止你从B活动开始的所有运行。
答案 1 :(得分:0)
取消ListActivity asynch任务的代码(它依次调用CursorAdpter ayscnh任务从DataBase加载图像),并获取CursorAdtpter aysnch任务参考并取消它也.....请参阅编辑问题代码,谢谢所有