[英]Android Broadcast Reciver Registering Multiple Listeners When used in a ViewPager
我有一個 ViewPager,它使用 Fragments 構建一個選項卡式視圖。 在片段中,我正在為該片段數據集注冊一個廣播接收器(數據從 RESTApi 更新。)
有 4 個選項卡,但每次用戶將選項卡帶入視圖時,它似乎都在注冊一個新的偵聽器,這不是很好。
我在 OnViewCreated() 方法中注冊它
它應該在 create() 中嗎?
我的片段 Class
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();
}
}
};
}
您在Fragment
有兩個地方注冊BroadcastReceiver
:
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
,因此它們仍然處於活動狀態。
您應該在onResume()
中注冊一個BroadcastReceiver
並在onPause()
中取消注冊。 另請參閱廣播概述
您可以在活動中而不是在片段中注冊接收器。
在活動中接收到廣播后,您可以獲取在視圖尋呼機中顯示的片段的當前實例,然后為該片段調用 updateCardView() 方法。
這樣,您只需在活動中注冊一次接收器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.