如何在新项目添加firebase实时数据库时停止循环查看自动刷新



嘿,我正在制作一个应用程序,该应用程序具有上传Instagram卷轴(如视频(的功能,我在回收器视图中设置了外部层,但当另一个用户添加新数据或用户上传了新卷轴时,回收器视图会在另一台手机上自动刷新,所有视频都会被卡住,请帮助这里是我的代码

public class NotificationFragemt extends Fragment implements Player.EventListener {
private RecyclerView recyclerView;
List<ModelVideos> videosList;
int currentPage=-1;
LinearLayoutManager layoutManager;
boolean is_user_stop_video=false;
VideoAdapter videoAdapter;
private CardView plus_card;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_notification_fragemt, container, false);
//        getActivity().getWindow().setStatusBarColor(getActivity().getColor(R.color.black));
// Inflate the layout for this fragment
recyclerView = view.findViewById(R.id.videorecyclerview);
videosList = new ArrayList<>();
layoutManager=new LinearLayoutManager(getContext());
recyclerView.setHasFixedSize(false);
plus_card = view.findViewById(R.id.plus_card);
plus_card.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), Upload_reels.class);
startActivity(intent);
}
});


//        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,true);
//        layoutManager.setStackFromEnd(true);
//        layoutManager.setReverseLayout(true);
recyclerView.setLayoutManager(layoutManager);
SnapHelper snapHelper =  new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
Collections.shuffle(videosList);
videoAdapter = new VideoAdapter(getActivity(),videosList);
loadpost();


recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//here we find the current item number
final int scrollOffset = recyclerView.computeVerticalScrollOffset();
final int height = recyclerView.getHeight();
int page_no=scrollOffset / height;
if(page_no!=currentPage ){
currentPage=page_no;
Release_Previous_Player();
Set_Player(currentPage);
}
}
});


return view;

}
SimpleExoPlayer privious_player;
public void Release_Previous_Player(){
if(privious_player!=null) {
privious_player.removeListener(this);
privious_player.release();
}
}
private void loadpost() {
DatabaseReference ref;
ref = FirebaseDatabase.getInstance().getReference("TravelReels");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
videosList.clear();
for (DataSnapshot ds : snapshot.getChildren()){
ModelVideos modelPost = ds.getValue(ModelVideos.class);

videosList.add(modelPost);
Collections.reverse(videosList);
Collections.shuffle(videosList);









}

setAdapter();



}

@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
});




}
private void setAdapter() {
if (!videoAdapter.hasObservers()) {
videoAdapter.setHasStableIds(true);
}
recyclerView.setAdapter(videoAdapter);

}
public boolean is_fragment_exits(){
FragmentManager fm = getActivity().getSupportFragmentManager();
if(fm.getBackStackEntryCount()==0){
return false;
}else {
return true;
}
}
public void Set_Player(int currentPage){
try {
LoadControl loadControl = new DefaultLoadControl.Builder()
.setAllocator(new DefaultAllocator(true, 16))
.setBufferDurationsMs(1 * 1024, 1 * 1024, 500, 1024)
.setTargetBufferBytes(-1)
.setPrioritizeTimeOverSizeThresholds(true)
.createDefaultLoadControl();

DefaultTrackSelector trackSelector = new DefaultTrackSelector();
final SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, loadControl);
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(getContext(),
Util.getUserAgent(getContext(), getContext().getResources().getString(R.string.app_name)));
Log.d("video_url"+currentPage,videosList.get(currentPage).getVideoUrl());
MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(videosList.get(currentPage).getVideoUrl()));
/* MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(proxyUrl));
Log.d(Variables.tag,item.video_url);
Log.d(Variables.tag,proxyUrl);*/

player.prepare(videoSource);
player.setRepeatMode(Player.REPEAT_MODE_ALL);
player.addListener(this);

View layout = layoutManager.findViewByPosition(currentPage);
final PlayerView playerView = layout.findViewById(R.id.reels_player);
playerView.setPlayer(player);
player.setPlayWhenReady(is_visible_to_user);
privious_player = player;
}
catch (Exception e){
}

}
boolean is_visible_to_user;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
is_visible_to_user=isVisibleToUser;
if(privious_player!=null && (isVisibleToUser && !is_user_stop_video)){
privious_player.setPlayWhenReady(true);
}
else if(privious_player!=null && !isVisibleToUser){
privious_player.setPlayWhenReady(false);
}
}

@Override
public void onResume() {
super.onResume();
is_visible_to_user = true;
if((privious_player!=null && (!is_user_stop_video)) && !is_fragment_exits() ){
privious_player.setPlayWhenReady(true);
}
}

@Override
public void onPause() {
super.onPause();
if(privious_player!=null){
privious_player.setPlayWhenReady(false);
}
}

@Override
public void onStop() {
super.onStop();
if(privious_player!=null){
privious_player.setPlayWhenReady(false);
}
}

@Override
public void onDestroy() {
super.onDestroy();
if(privious_player!=null){
privious_player.release();
}
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onTimelineChanged(Timeline timeline, @Nullable Object manifest, int reason) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
}
@Override
public void onLoadingChanged(boolean isLoading) {
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
}
@Override
public void onPositionDiscontinuity(int reason) {
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
@Override
public void onSeekProcessed() {
}
}

loadpost函数中,您使用的是addValueEventListener,每当TravelReels节点发生更改时,它都会调用onDataChange

如果你不想,它应该听取这些持续的变化。只加载一次数据。然后您可以使用addListenerForSingleValueEvent,它将只被调用一次。点击此处阅读更多信息:https://firebase.google.com/docs/database/android/read-and-write#read_once_using_a_listener

但如果你想自己控制它,那么只需添加一个布尔标志shouldRefresh,根据你的需要使其为真/假&只有当它为true时才通知适配器。写你的逻辑。

最新更新