在异步回调中重新启用MenuItem

时间:2016-08-17 00:58:46

标签: android listview android-asynctask menuitem

所以我有 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,如果有,我该怎么办? 两个这样的回调(所以这个重新启用必须在最终回调完成时完成)?

1 个答案:

答案 0 :(得分:1)

execute方法应该有onSuccess和onFailure回调。

然后你应该在每个片段上实现这些方法,让活动知道(使用监听器接口)execute方法完成。

活动应该实现接口,当所有片段都已通知已完成执行时,只需调用invalidateOptionsMenu。

onCreateOptionsMenu应启用或禁用刷新菜单项,具体取决于是否所有碎片都已通知执行完毕。

希望您明白这个想法,或者告诉我您是否需要示例代码。