停止另一个活动时销毁活动

时间:2014-02-23 09:18:51

标签: android android-activity lifecycle

我有一个活动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");

2 个答案:

答案 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任务参考并取消它也.....请参阅编辑问题代码,谢谢所有