2016-08-17 24 views
0

所以我有一个的Android活动有三个标签片段,每一个列表视图,其中两个房子什么基本上是一个RSS料填充的异步打电话给重新启用菜单项中的异步回调

有一个菜单按钮,编号为action_refresh,它调用每个片段的个人refresh()方法。这些方法清除填充列表对象的List,并notifyDataSetChanged()定制适配器,然后他们叫异步方法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方法之外的菜单项,虽然我怀疑那里在于解决方案。

所以我的问题是,在坚果壳,我怎么重新启用从一个异步一个MenuItem回调,我应该做的,如果有2个的回调(什么使这个重新启用绝当最后的回调完成时完成)?

回答

1

执行方法应该有onSuccess和onFailure回调。

然后,您应该在每个片段上实现这些方法,并让活动知道(使用侦听器接口)执行方法已完成。

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

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

希望你有想法或让我知道如果你需要一个示例代码。

+0

感谢您的指点,但是您通过onSuccess回调是什么意思?我使用onPostExecute回调,我应该在父活动中听这个吗?这将是什么样的听众? onPostExecuteListener? – Nevermore

+0

回调是在异步操作完成时调用的方法。我不确定GetVideoFeed类里面有什么,也许你可以编辑代码并将其添加到原始文章中。既然你提到onPostExecute方法,我假设你正在使用一个AsyncTask对象。在该方法(onPostExecute)上,您应该通知您的活动已完成该任务(通过使用片段中定义的接口侦听器,请参阅https://developer.android.com/training/basics/fragments/communicating.html) 。当所有片段都通知活动时,您可以调用invalidateOptionsMenu。 – fernandospr