1

晚上好,片段TabLayout/GridView的OutMemory

在創造我的第一個真正的個人項目,我有每個包含TabLayout 2/3片段5個片段。每個GridView約有50個圖像(有些參見200)。 但是當我在片段之間切換時,我很快就會到達OutMemory。 我處於創建/測試階段,我在應用程序中使用了8個Drawable(400px * 250px大小,大小在40kB到200kB之間)。

使用時使用的內存空間,第一個選擇是啓動骰子(8個圖像),每個後續選擇代表包含TabLayout的片段的打開。長達30秒或我返回到第一個片段。

enter image description here

在片段創建TabLayout:

private void setupViewPager(ViewPager viewPager) { 
 
        ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager()); 
 
  
 
        FragmentList fla = FragmentList.newInstance("ONE", ContextCompat.getColor(getContext(), R.color.w_blue_grey_40)); 
 
        adapter.addFragment(fla, "ONE"); 
 
        fla = FragmentList.newInstance("TWO", ContextCompat.getColor(getContext(), R.color.w_blue_grey_40)); 
 
        adapter.addFragment(fla, "TWO"); 
 
  
 
        viewPager.setAdapter(adapter); 
 
    } 
 
  
 
    class ViewPagerAdapter extends <strong>FragmentStatePagerAdapter</strong> { 
 
  
 
        private final List<FragmentList> mFragmentList = new ArrayList<>(); 
 
        private final List<String> mFragmentTitleList = new ArrayList<>(); 
 
  
 
        public ViewPagerAdapter(FragmentManager manager) { 
 
            super(manager); 
 
        } 
 
  
 
        @Override 
 
        public Fragment getItem(int position) { 
 
            return mFragmentList.get(position); 
 
        } 
 
  
 
        @Override 
 
        public int getCount() { 
 
            return mFragmentList.size(); 
 
        } 
 
  
 
        public void addFragment(FragmentList fragment, String title) { 
 
            mFragmentList.add(fragment); 
 
            mFragmentTitleList.add(title); 
 
        } 
 
  
 
        @Override 
 
        public CharSequence getPageTitle(int position) { 
 
            return mFragmentTitleList.get(position); 
 
        } 
 
    }

我用畢加索等圖案片夾在我GridViewAdapter:

@Override 
 
public View getView(int position, View convertView, ViewGroup parent) { 
 
     View row = convertView; 
 
    
 
     TestHolder holder = null; 
 
    
 
     if (row == null) { 
 
      LayoutInflater mInflater = (LayoutInflater) 
 
        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
 
      row = mInflater.inflate(R.layout.card_test, null); 
 
    
 
      holder = new TestHolder(); 
 
      holder.test_image = (ImageView) row.findViewById(R.id.test_image); 
 
      row.setTag(holder); 
 
     } else { 
 
      holder = (TestHolder) row.getTag(); 
 
     } 
 
    
 
     Test test = data.get(position); 
 
      Picasso.with(context).load(test.getImage()).into(holder.test_image); 
 
      
 
     return row; 
 
    } 
 
    
 
    class TestHolder { 
 
     ImageView test_image; 
 
    }

Thx all for your answers。

+0

試試這個答案... http://stackoverflow.com/a/31260418/3678308 –

+0

* 400像素* 250像素大小,大小:40KB和200kB的之間沒有*,大小爲給定寬度和高度爲常量它是400kB – Selvin

回答

1

內存不足是一個有趣的問題。我建議查看解決方案嘗試:

  1. 設置屏幕外的頁面限制爲1。因此,將只在內存

    viewpager.setOffscreenPageLimit(1). 
    
  2. 同時節省1個片段在每一個片段,請嘗試使用RecyclerView GridLayout作爲LayoutManager。 RecyclerView是一個很好的工具,可以幫助我們節省內存不足

  3. 嘗試用圖像加載器的Glide替換Picasso。也許內存不足是因爲圖像太大。 Glide是內存管理中最好的圖像加載器庫(我認爲)。

+1

僅僅使用Glide解決了內存問題。儘管如此,我在GridLayoutManager中使用了一個RecyclerView,但滾動並不流暢,只是手指在屏幕上的位置停下來。 – GJer