android ViewPager中頁面消極式載入的實現

來源:互聯網
上載者:User

標籤:android   style   blog   http   color   使用   os   io   

對於viewpager的使用,如果說是請求的資料對記憶體的消耗不到的話,這是很理想的,但是如果說請求的資料對記憶體消耗的比較大的話這樣就容易出現oom(比如說圖片),在使用viewPager的時候使用setOffscreenPageLimit(int size)預設的是1,所以說我們怎麼設定這個值,在載入資料的話會將當前頁面和下個頁面的資料同時的進行請求,這在某種情況下時非常的影響效能的,還有就是在當前頁面和下個頁面在viewPager中算作了同一個頁面,因為你是無法通過生命週期來進行控制資料的消極式載入,所以現在很多網友通過修改v4包進行修改setOffscreenPageLimit(int size)的預設值為0;但是這樣雖然效果實現了,但是會引發另一個問題,那就是在切換頁面時,中間過渡的是一個大大的黑屏,myGod的這種修改對體驗算是致命的打擊對於我而言,不過最後終於還是被我搞定了;

 之前的一種方式在我之前的部落格中有寫,下面介紹的是另一種方式:結合Fragment來處理,廢話不說直接上代碼:

MainActivity 
public class MainActivity extends FragmentActivity { private ViewPager pager; private ArrayList<Fragment> fts = new ArrayList<Fragment>(); private String[] urls = new String[]{ "http://t2.qpic.cn/mblogpic/d5149f8549e394000aa6/2000", "http://t2.qpic.cn/mblogpic/fad173ab259d7efbfecc/2000", "http://t2.qpic.cn/mblogpic/463b55016d51d4b9c172/2000", "http://t2.qpic.cn/mblogpic/ab3f96d6095ec82e6d40/2000", "http://t2.qpic.cn/mblogpic/e61f017bcad2684e79f2/2000", "http://t2.qpic.cn/mblogpic/d271142c68e6e1d5b8de/2000", "http://t2.qpic.cn/mblogpic/ef50986bdf4dd8801060/2000", "http://t2.qpic.cn/mblogpic/71585d34aaa60b9dcc2a/2000", "http://t2.qpic.cn/mblogpic/e0011bad45ae23889216/2000", "http://t2.qpic.cn/mblogpic/6e84cb60bf0e6b4945f6/2000", "http://t2.qpic.cn/mblogpic/5a9217624c130c2fa9f8/2000", "http://t2.qpic.cn/mblogpic/7ddb0e9618754fc4bc8e/2000", "http://t2.qpic.cn/mblogpic/eed45f9d4b5001a04b30/2000", "http://t2.qpic.cn/mblogpic/62353a0dbdd40bc1be9a/2000", "http://t2.qpic.cn/mblogpic/0ccf7f16318331e9a892/2000", "http://t2.qpic.cn/mblogpic/4e55efffef93f6d4a86e/2000", "http://t2.qpic.cn/mblogpic/4ac76f1427e4278b7172/2000", "http://t2.qpic.cn/mblogpic/0db3a5a1047d7ee52bdc/2000", "http://t2.qpic.cn/mblogpic/c65d09035d7b6c644d6a/2000", "http://t2.qpic.cn/mblogpic/7ebf4b49bf7e2ef6a716/2000", "http://t2.qpic.cn/mblogpic/4ba5fd867149273f9b02/2000", "http://t2.qpic.cn/mblogpic/4f375f19fbd08151d0f8/2000", "http://t2.qpic.cn/mblogpic/1c22a0574274d0e3c866/2000", "http://t2.qpic.cn/mblogpic/50cdf4f63120ccf74e86/2000", "http://t2.qpic.cn/mblogpic/ab8588008e7865927d7c/2000", "http://t2.qpic.cn/mblogpic/1e9e65d61d5f2bb8ebc4/2000", "http://t2.qpic.cn/mblogpic/6913e7ad5c7267969d9a/2000", "http://t2.qpic.cn/mblogpic/54157580cc7ddf7b2870/2000", "http://t2.qpic.cn/mblogpic/0bd2f9be53d2c9aec8ca/2000", "http://t2.qpic.cn/mblogpic/2041a03d63cc6c5b9b92/2000", }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pager = (ViewPager) findViewById(R.id.pager); for (int i = 0; i < urls.length; i++) { fts.add(PhotoFragment.instance(urls[i], i)); } pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(), fts)); pager.setOffscreenPageLimit(fts.size()); pager.setCurrentItem(0); } private class MyPagerAdapter extends FragmentPagerAdapter{ private ArrayList<Fragment> list; public MyPagerAdapter(FragmentManager fm,ArrayList<Fragment> list) { super(fm); this.list = list; } @Override public Fragment getItem(int arg0) { return list.get(arg0); } @Override public int getCount() { return list.size(); } }}

PhotoFragment:

package com.zhizhi.viewpagernocache;import com.nostra13.universalimageloader.core.ImageLoader;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;public class PhotoFragment extends Fragment {    private final static String TAG = PhotoFragment.class.getName();    private String url;    private int index;    private ImageView image;    public static PhotoFragment instance(String url, int index) {        PhotoFragment fragment = new PhotoFragment();        Bundle bundle = new Bundle();        bundle.putString("url", url);        bundle.putInt("index", index);        fragment.setArguments(bundle);        return fragment;    }                @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (getArguments() != null) {            url = getArguments().getString("url");            index = getArguments().getInt("index");        }        setRetainInstance(true);            }    @Override    public void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        outState.putString("url", url);        outState.putInt("index", index);            }    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        if (savedInstanceState != null) {            url = savedInstanceState.getString("url");            index = savedInstanceState.getInt("index");        }        View view = inflater.inflate(R.layout.view_photo, container, false);        image = (ImageView) view.findViewById(R.id.image);        return view;    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);            }    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if (isVisibleToUser) {            Log.i(TAG, "get pic data for show");            ImageLoader.getInstance().displayImage(url, image);        }        }}

以上就是代碼的核心部分了;

源碼Demo :http://files.cnblogs.com/kingfly13/ViewPagerNoCache.zip

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.