我已经使用片段实现了动态标签导航。片段存储在堆栈中,当用户更改选项卡时,新片段应替换现有内容以显示新项目。 但首先,必须刷新数据(它们将从rest webservice下载)并且需要一些时间,因此还有BusyFragment,表示数据加载过程。
我使用AsyncTask实现了后台刷新数据,并且我有一个单独的AsyncTask对象,可以通过以下方式调用以刷新特定选项卡:
private void RefreshShopsMainMenuFragment(Fragment f)
{
if (refreshAsyncTaskShops != null && refreshAsyncTaskShops.getStatus() != AsyncTask.Status.FINISHED)
return;
final ListFragment fragmentToRefresh = (ListFragment) f;
refreshAsyncTaskShops = new AsyncTask<Void, Void, ArrayList<ListDataDef>>()
{
@Override
protected void onPreExecute()
{
ShowBusyFragment(true, Global.TAB_SHOPS); //for other tabs, other tab identifiers from Global
}
@Override
protected ArrayList<ListDataDef> doInBackground(Void... voids)
{
return ShopsTabDataProvider.GetNewData(); //For other tabs, different data provider call
}
@Override
protected void onPostExecute(ArrayList<ListDataDef> result)
{
fragmentToRefresh.mainData = result;
fragmentToRefresh.DisplayNewData();
ShowBusyFragment(false, Global.TAB_SHOPS); //for other tabs, different tab indentifier
}
};
refreshAsyncTaskShops.execute();
}
所以,基本上如上图所示:刷新商店选项卡,将调用refreshAsyncTaskShops,还有其他异步任务对象,我标记的行不同。
有没有更优雅的解决方案,而没有声明多个AsyncTask对象?我对当前的实现并不完全满意,因为我的所有异步任务对象基本相同。
另外,正如您所看到的,没有任何队列,因此不需要等待第一个选项卡刷新并刷新另一个选项卡。但是,同时多次刷新同一个选项卡应该永远不会发生,所以我添加了if条件,以防止在前一个任务尚未完成时执行相同的任务。