2013-04-08 96 views
0

我实现了一个搜索文本为我的名单,搜索的文字和图片的内存溢出异常

每个列表行项目包括文本和图像,我从服务器上下载。

我alsways保持两个列表,一个是文本和图像等一个是文本和图像的排序列表的原始列表...

如果我的列表containes只有4项,所以我的应用效果很好,但是如果我的列表containes 20个项目,每个图像为1MB,我需要保持两个列表listImagesOriginal,适配器(= 40MB)内image_array我收到了一个内存溢出异常。

我怎样才能减少内存消费,我不会recive一个内存溢出异常?

非常感谢

我如何能减少

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(); 

      } 
+1

保持图像是不是一个好主意,因为它消耗的内存极大。 (特别是对于应用程序,这可能会降低设备和消耗大量功率的),除非你有一个特别的理由让加载的图像,尝试本地存储的地方的形象和对存储的文件路径,而不是。 – wns349 2013-04-08 14:39:32

+0

谢谢,我如何将图像保存到SD卡?并在我的应用程序退出删除它们? – 2013-04-08 14:46:26

回答

0

40MB是太多了机器人。每部手机都有应用程序内存限制,比大多数高端手机使用的要高40MB。您需要实现图像的磁盘和/或内存缓存。

+0

谢谢,我如何将图像保存到SD卡?并在我的应用程序退出删除它们? – 2013-04-08 14:45:10

+0

要保存OT了SD卡,你需要的WRITE_EXTERNAL_STORAGE permissing。然后您可以调用getExternalStorageDirectory来获取外部驱动器的位置。然后像平常一样写入文件。 – 2013-04-08 14:47:46

+0

谢谢,还有,android模拟器会支持将图像写入sd? – 2013-04-08 14:48:40

0

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

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