正确刷新背景线程

时间:2015-09-09 07:07:16

标签: java android android-fragments android-asynctask

我已经使用片段实现了动态标签导航。片段存储在堆栈中,当用户更改选项卡时,新片段应替换现有内容以显示新项目。 但首先,必须刷新数据(它们将从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条件,以防止在前一个任务尚未完成时执行相同的任务。

0 个答案:

没有答案