java - ViewPager के स्लाईप पर एक्सप्लेयर को रोकना




android android-viewpager (2)

मैं एकल खंड उदाहरण के साथ एक ViewPager का उपयोग कर रहा हूँ जिसमें मैं Media फाइलों जैसे छवियाँ, वीडियो, ऑडियो दिखा रहा हूँ

मैंने Video और Audio फ़ाइलों को संभालने के लिए ExoPlayer लागू किया है। और छवियों के लिए Glide

स्मृति लीक से बचने के लिए मैं इस तरह से ExoPlayer वस्तु जारी कर रहा हूँ ItemViewerFragment.java :

 private void releasePlayer() {
        if (player != null) {
            player.release();
            player = null;
            trackSelector = null;
            simpleExoPlayerView.setPlayer(null);
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        if (player == null && currentGalleryModel != null) {
            initializePlayer();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (player == null && currentGalleryModel != null) {
            initializePlayer();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        releasePlayer();
    }

    @Override
    public void onStop() {
        super.onStop();
        releasePlayer();
    }

और पर onViewCreated() मैं इस तरह से दृश्य को प्रारंभ कर रहा हूँ:

 @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        if (currentGalleryModel.isVideo() || currentGalleryModel.isAudio()) {

            simpleExoPlayerView.setVisibility(View.VISIBLE);
            imageView.setVisibility(View.GONE);

            initializePlayer();
        } else if (currentGalleryModel.isImage() || currentGalleryModel.isGif()) {
            simpleExoPlayerView.setVisibility(View.GONE);
            imageView.setVisibility(View.VISIBLE);


            Glide.with(this)
                    .load(currentGalleryModel.getFilePath())
                    .placeholder(android.R.color.black)
                    .fitCenter()
                    .diskCacheStrategy(DiskCacheStrategy.NONE)
                    .into(imageView);

        }
    }

मैं FragmentStatePagerAdapeter का उपयोग कर रहा हूँ यह getItem विधि है:

@Override
public Fragment getItem(int position) {
    return ItemViewerFragment.newInstance(mItems.get(position));
}

मैं Viewpager पहले कड़ी चोट पर खंड का पता लगा सकते हैं। दूसरी स्वाइप video/audio फाइलों पर खेल बंद कर दिया है।

गतिविधि में मैंने जोड़ने की कोशिश की है। .addOnPageChangeListener :

@Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

     try {
        ((ItemViewerFragment)mAdapter.getItem(mPreviousPos)).imHiddenNow();
        } catch (Exception e) {
            e.printStackTrace();
        }
        mPreviousPos = position;
    }

और ItemViewerFragment.java :

public void imHiddenNow(){
      releasePlayer();
    }

अभी भी video/audio खेलने पर रहता है।

यहां स्क्रीनकास्ट के लिए एक वीडियो लिंक है

डेमो प्रोजेक्ट GitHub लिंक

कृपया ध्यान दें कि नीचे पोस्ट किया गया समाधान काम नहीं करता है


एक्सप्लेयर और मैं थोड़े से भी इसी तरह की समस्या से निपटने के बाद एक साल बाद यह अधिक रहा। कृपया ध्यान दें कि एपीआई ने थोड़ा बदल दिया है इसलिए एक संभावित समाधान को कार्यान्वित करने के बारे में एक विचार पाने के लिए निम्नलिखित कोड का पालन करें। कृपया मुझे बताएं कि यह काम नहीं कर रहा है, मैं आगे एपीआई देखता हूं और आपके पास वापस आऊंगा।

समाधान के लिए आ रहा है:

private int mPlayerCurrentPosition;

private int getCurrentPlayerPosition() {
     return mExoPlayer.getCurrentPosition();
}

// call this from onPause
private void releaseExoplayer() {
     mPlayerCurrentPosition = getPlayerCurrentPosition();
     mExoPlayer.setPlayWhenReady(false);
     mExoPlayer.release(); // this will make the player object eligible for GC
}

private void resumePlaybackFromPreviousPosition(int prevPosition) {
    mExoPlayer.seekTo(mPlayerCurrentPosition );
}

पेजर एडाप्टर के लिए यहां कोड दिया गया है:

 class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> 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(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

यह पुस्तक श्रोता है:

  viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
          //Stop media here.
        }

        @Override
        public void onPageSelected(int position) {
          //Save your previous position here.
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

मीडिया के लिए आप लूप का उपयोग कर सकते हैं और सूची में सभी टुकड़ों को एक बार में जोड़ सकते हैं और फिर इसका उपयोग दक्षता के लिए कर सकते हैं:

viewPager.setOffscreenPageLimit(3);

यह सुनिश्चित करेगा कि आपके टुकड़े के केवल 3 उदाहरण उपलब्ध हैं जो कि पर्याप्त है

एकल खंड का उपयोग करने के लिए मैं आपको ऐसा करने के लिए सुझाव देता हूँ:

 public MyFragment() {

}

//This is to send a file to the fragment if you need it.
public static MyFragment newInstance(File file) {
    MyFragment fragment = new MyFragment();
    Bundle bundle = new Bundle();
    bundle.putSerializable("file", file);
    fragment.setArguments(bundle);
    return fragment;
}

फिर टुकड़ों के कॉन्टेट में आप अपनी फ़ाइल को इस तरह से पुनः प्राप्त कर सकते हैं:

File file;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    file = getArguments().getSerializable("file");

}

अब अपने टुकड़े इस तरह पेजर पर जोड़ें:

 for (int i = 0; i < totalFiles; i++) {
            viewPagerAdapter.addFragment(MyFragment.newInstance(fileList.get(i));
        }

उम्मीद है की यह मदद करेगा।





exoplayer