所以我有 Android 活动,其中包含三个标签片段,每个标签视图,其中两个其中包含基本上是一个 RSS 源,其中包含异步调用。
有一个名为action_refresh
的菜单按钮,用于调用每个片段的个人refresh()
方法。这些方法清除填充列表的List
个对象以及自定义适配器上的notifyDataSetChanged()
,然后他们调用异步方法{{1} }:
GetVideoFeed()
类似的方法用于其他片段。
private void refresh() {
if (episodes.size() > 1){
episodes.clear();
episodeAdapter.notifyDataSetChanged();
}
new GetVideoFeed().execute("http://www.example.org/podcast-video.xml");
}
按钮调用:
action_refresh
我的问题在于,用户可能会在异步方法完成之前多次点击刷新,因此 if (id == R.id.action_refresh) {
// Disable the action
item.setEnabled(false);
// Call refresh on the fragments
getSupportFragmentManager().getFragments();
for(Fragment x :getSupportFragmentManager().getFragments()){
if (x instanceof PodcastFragment) {
((PodcastFragment) x).refresh();
}
if (x instanceof StoryFragment) {
((StoryFragment) x).refresh();
}
if (x instanceof DownloadFragment) {
((DownloadFragment) x).refresh();
}
}
// Somehow enable this after async call...
item.setEnabled(true);
return true;
}
会多次填充。我想重新启用 回调上的菜单ListView
,但是异步线程不会修改主线程,而且我没有'知道如何访问item
方法之外的菜单项,尽管我怀疑解决方案存在问题。
所以我的问题是,在一个坚果壳中,我如何重新启用来自异步回调的onOptionsItemSelected
,如果有,我该怎么办? 两个这样的回调(所以这个重新启用必须在最终回调完成时完成)?
答案 0 :(得分:1)
execute方法应该有onSuccess和onFailure回调。
然后你应该在每个片段上实现这些方法,让活动知道(使用监听器接口)execute方法完成。
活动应该实现接口,当所有片段都已通知已完成执行时,只需调用invalidateOptionsMenu。
onCreateOptionsMenu应启用或禁用刷新菜单项,具体取决于是否所有碎片都已通知执行完毕。
希望您明白这个想法,或者告诉我您是否需要示例代码。