搜索文本和图像OutOfMemory异常

时间:2013-04-08 14:34:56

标签: java android

我为我的列表实现了搜索文本,

每个列表行项目都包含我从服务器下载的文本和图像。

我总是保留两个列表,一个是文本和图像的原始列表,另一个是文本和图像的排序列表......

如果我的列表只包含4个项目,那么我的应用程序运行良好,但是如果我的列表包含20个项目并且每个图像是1MB并且我需要保留两个列表listImagesOriginal,image_array在适配器内(= 40MB)我收到OutOfMemory异常

如何减少内存消耗,我不会发现OutOfMemory异常?

非常感谢

我该如何减少

private MyCustomAdapter adapter;

private List<String> text = new ArrayList<String>();
private List<Bitmap> listImages;



private List<String> textOriginal = new ArrayList<String>();
private List<Bitmap> listImagesOriginal =new ArrayList<Bitmap>();

adapter =new MyCustomAdapter(text,listImages);
         ListView.setAdapter(adapter);



searchText= (EditText) findViewById(R.id.profile_page_search);

         searchText.addTextChangedListener(new TextWatcher()
         {
             public void afterTextChanged(Editable s)
             {
                   // Abstract Method of TextWatcher Interface.
                 textlength = searchText.getText().length();
                 adapter.deleteAllForSearch();
                 for (int i = 0; i < textOriginal.size(); i++)
                 {

                         if(textOriginal.get(i).contains(
                                 searchText.getText().toString().trim()))
                         {
                             adapter.addObjectForSearch(textOriginal.get(i), listImagesOriginal.get(i));
                         }

                 }
             }
             public void beforeTextChanged(CharSequence s,
                     int start, int count, int after)
             {
                 // Abstract Method of TextWatcher Interface.
             }
             public void onTextChanged(CharSequence s,
                     int start, int before, int count)
             {

              }
          });




class MyCustomAdapter extends BaseAdapter{
          public   List<String> text_array = new ArrayList<String>();
          public   List<Bitmap> image_array = new ArrayList<Bitmap>();


          public int getCount(){
               return text_array.size();
          }

          MyCustomAdapter(List<String> text, List<Bitmap>)
          {

           text_array = text;
           image_array = image;

          }

          public long getItemId(int position){
               return position;
          }
          public String getItem(int position){
               return null;
          }
          public View getView(final int position, View convertView, ViewGroup parent) {
               //my implementation
          }

public void addObjectForSearch(String text, Bitmap bitmap) {
                text_array.add(text);
                image_array.add(bitmap);


                notifyDataSetChanged();

          }

2 个答案:

答案 0 :(得分:0)

对于Android来说40MB太多了。每部手机都有每个应用内存限制,40MB甚至高于大多数高端手机使用。您需要实现图像的磁盘和/或内存缓存。

答案 1 :(得分:0)

您需要使用缓存和/或将它们存储到持久性内存(数据库,文件系统等),因为您不希望所有这些位图同时加载到内存中,特别是如果您没有看到它们一切都在同一时间。许多旧设备的VM堆大小约为16-24MB,您需要能够保持合理的内存使用量。

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html