Android Broadcast Reciver Регистрация нескольких слушателей при использовании в ViewPager - PullRequest
0 голосов
/ 09 октября 2019

У меня есть ViewPager, который создает представление с вкладками с фрагментами. Во Фрагментах, которые я регистрирую, получатель Broadcast для этого Фрагмента DataSet (данные обновляются из RESTApi.)

есть 4 вкладки, но, кажется, регистрирует нового слушателя каждый раз, когда вкладка отображаетсяпользователем, который не может быть хорошим.

Я регистрирую его в методе OnViewCreated ()

Должно ли оно быть в create ()?

Мой класс фрагментов

public class DynamicFragment extends Fragment {

private static final String ARG_SECTION_NUMBER = "section_number";
private static final String ARG_TITLE = "title";
//.......
//.......

private Context context;
RecyclerView cardRecyclerView;
View view;
PresentationAdapter presentationAdapter;

public DynamicFragment() {
    // Required empty public constructor
    SyncApplication.getContext().registerReceiver(mReceiver, new IntentFilter(Sync.BROADCAST_FILTER));
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;

}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    sectionNumber = getArguments() != null ? getArguments().getInt(ARG_SECTION_NUMBER) : 1;
    title = getArguments() != null ? getArguments().getString(ARG_TITLE) : "Search";
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if (title.equals("Search")){
        Search search = new Search(inflater, container, savedInstanceState);
        return search.setView();
    }
    else{
        view = inflater.inflate(R.layout.fragment_dynamic, container, false);
        cardRecyclerView = view.findViewById(R.id.presentation_cards_recycler);
        presentationAdapter = new PresentationAdapter(context, getPresentationListByCategory());
        cardRecyclerView.setLayoutManager(new GridLayoutManager(context, 2));
        cardRecyclerView.setItemAnimator(new DefaultItemAnimator());
        cardRecyclerView.setAdapter(presentationAdapter);

        // Inflate the layout for this fragment
    }
    return view;
}

public void updateCardView() {
    if (presentationList != null && presentationList.size() > 0) {
        if (presentationAdapter != null) {
            presentationAdapter.setPresentationList(getPresentationListByCategory());
            presentationAdapter.notifyDataSetChanged();
        }
    }
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (context != null) {
        context.registerReceiver(mReceiver, new IntentFilter(Sync.BROADCAST_FILTER));
    }
}

public ArrayList<Presentation> getPresentationListByCategory() {
    dbManager = new DbManager(context);
    presentationList = dbManager.getAllPresentations();
    ArrayList<Presentation> presentationsByCategory = new ArrayList();

    for (Presentation presentation : presentationList) {
        if (presentation.getCategory_name().equals(title)) {
            presentationsByCategory.add(presentation);
        }
    }
    return presentationsByCategory;
}

public static DynamicFragment newInstance(String val) {
    DynamicFragment fragment = new DynamicFragment();
    Bundle args = new Bundle();
    args.putString("title", val);
    fragment.setArguments(args);
    return fragment;
}

BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Do what you need in here
        String message = intent.getStringExtra("syncMessage");
        Log.d("Fragment Reciever", message);
        if (message.equals("DownloadComplete")) {
            updateCardView();
        }
    }
};

}

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Есть два места, где вы регистрируете BroadcastReceiver в ваших Fragment:

public DynamicFragment() {
    // Required empty public constructor
    SyncApplication.getContext().registerReceiver(mReceiver, new IntentFilter(Sync.BROADCAST_FILTER));
}

и

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (context != null) {
        context.registerReceiver(mReceiver, new IntentFilter(Sync.BROADCAST_FILTER));
    }
}

Так как они оба используют один и тот же IntentFilter, этоуже один слишком много. Кроме того, вы не отменяете регистрацию ни одного из зарегистрированных BroadcastReceiver s, поэтому они остаются активными.

Вы должны зарегистрировать BroadcastReceiver, например, в onResume() и отменить его регистрацию в onPause(). См. Также Обзор трансляций

1 голос
/ 09 октября 2019

Вы можете зарегистрировать получателя в действии, а не во фрагменте.

Получив трансляцию в действии, вы можете получить текущий экземпляр фрагмента, отображаемый в пейджере представления, а затем вызвать updateCardView. () метод для этого фрагмента.

Таким образом, вы регистрируетесь на приемник только один раз в активности.

...