2015-06-19 26 views
1

我有一个小程序,在那里你可以点击一个图像,然后将其改变。但这个小应用程序有一个非常高的内存使用情况,我想不通为什么:(。或者只是正常的,我要实现对内存很多方法,节约?...为什么这么高的内存使用率?

当我点击12次我手机上的内存使用量超过120兆字节 的图像都是围绕200KB

活动:。

public class Activity_easy extends Activity { 

    GridView gridView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.easy_layout); 

     Button btn_back = (Button) findViewById(R.id.btn_back); 

     btn_back.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       startActivity(new Intent(getApplicationContext(), 
         MainActivity.class)); 
       finish(); 
      } 
     }); 

     gridView = (GridView) findViewById(R.id.gridview); 
     gridView.setAdapter(new ImageAdapter(this)); 
     final ImageAdapter ImageAdapter = new ImageAdapter(this); 

     gridView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
       Toast.makeText(gridView.getContext(), "Position: " + position, Toast.LENGTH_SHORT).show(); 

       ImageAdapter.switchImage(position, view); 
      } 

     }); 
    } 
} 

ImageAdapter:

public class ImageAdapter extends BaseAdapter { 

    private Context mContext; 
    private Integer[] pictures; 

    public ImageAdapter(Context c) { 
     mContext = c; 
     List<Integer> pictureList = new ArrayList<Integer>(); 
     for(int i=0; i<6; i++) { 
      pictureList.add(i); 
      pictureList.add(i); 
     } 
     Collections.shuffle(pictureList); 
     pictures = (Integer[]) pictureList.toArray(new Integer[0]); 
    } 

    public int getCount() { 
     return pictures.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 

    public ImageView getView(int position, View convertView, ViewGroup parent) { 

     ImageView imageView; 
     int size = mContext.getResources().getDimensionPixelSize(R.dimen.gridview); 

     if (convertView == null) { 
      // if it's not recycled, initialize some attributes 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new LinearLayout.LayoutParams(size, size)); 
      imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
      imageView.setPadding(8, 8, 8, 8); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     imageView.setImageResource(R.drawable.card_back); 
     return imageView; 
    } 

    public void switchImage(int position, View view){ 

     ImageView img = (ImageView) view; 
     int piece = pictures[position]; 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inDither = false; 
      options.inJustDecodeBounds = false; 
      options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
      options.inSampleSize = 3; 

      Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(),mThumbIds[piece],options); 
     img.setImageBitmap(icon); 

    } 

// references to our images 
    private Integer[] mThumbIds = { 
      R.drawable.pic_1, 
      R.drawable.pic_2, 
      R.drawable.pic_3, 
      R.drawable.pic_4, 
      R.drawable.pic_5, 
      R.drawable.pic_6, 
     }; 
} 

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

     <GridView 

     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:orientation="vertical"  
     android:id="@+id/gridview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:numColumns="3" 
     android:stretchMode="columnWidth" 
     android:padding="5dp" 
     android:verticalSpacing="5dp" 
     android:horizontalSpacing="10dp"   
     android:gravity="center_vertical" 
     android:layout_marginBottom="100dp"/> 

     <Button 
     android:id="@+id/btn_back" 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" 
     android:text="@string/back_button" /> 

</RelativeLayout> 
+0

这可能是因为您加载所有的12个图像到内存中,并没有处置它们赶走正确 –

+0

要创建2个图像适配器 – Eoin

+0

此行是极不寻常的:'最后ImageAdapter ImageAdapter =新的ImageAdapter(this);' – MaxZoom

回答

0

这就像@Rakshith拉维说,可能是因为您在您的应用程序图像上加载图像。我假设您为每个发布的图片设置onClickListeners,对吧?这意味着无论你如何修改一个图像,都意味着你必须对其他图像做同样的事情。此外,您还可以将这些图像中的几个堆叠在一起。由于您没有删除以前的图像或从数据库访问图像,因此会使用很多手机的内存。如果您有任何问题,请随时发表评论。

真诚,

阿尼

+0

那么我怎么才能合适地删除以前的图片呢?我用来构建这些代码的大多数示例都与我的一样。 – h0ppel

+0

您可以使用removeViewAt函数。我将添加另一篇文章,告诉你如何做到这一点。 –

0

如果你想删除一个视图,这里是如何做到这一点。我将大幅缩减您的代码以展示这一点。

RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout_id_here); 

//I am assuming your imageview is the first item in the relative layout 
layout.removeViewAt(0); 
ImageView image = new ImageView(getActivity()); 
image.setImageResource(R.drawable.whateverImage); 
Button button = (Button) findViewById(R.id.button_id); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v){ 
     layout.removeViewAt(0); 
     ImageView image = new ImageView(getActivity()); 
     image.setImageResource(R.drawable.whateverImage); 
    } 
}); 

请编辑它以便它适合您的情况。如果您还有其他问题,请告诉我。我会很乐意提供帮助。

真诚,

阿尼

相关问题