代码之家  ›  专栏  ›  技术社区  ›  Dragon warrior

如何确保没有并发的FragmentTransaction?

  •  1
  • Dragon warrior  · 技术社区  · 12 年前

    在我的应用程序中,我有一个 ListFragment :

    Fragment fragment =  new MyFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(resId, fragment, "tag");
    transaction.addToBackStack("tag");
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    transaction.commit();
    

    当用户点击时 刷新 按钮,它将刷新列表:

    Fragment newFragment =  new MyFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    
    Fragment oldFragment = fragmentManager.findFragmentByTag(tag);
    transaction.remove(oldFragment);
    fragmentManager.popBackStack();
    
    transaction.replace(resId, newFragment, "tag");
    transaction.addToBackStack("tag");
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    transaction.commit();
    

    因此,它将从堆栈中删除旧片段,并将新片段添加到其中。

    问题是如果用户点击 刷新 按钮的速度非常快,这可能会导致覆盖问题,即旧片段不会从片段容器中删除。

    我想这是一个并发问题。

    如果是这样的话,有没有办法“锁定”交易,让另一个交易等到上一个交易完成?

    1 回复  |  直到 12 年前
        1
  •  1
  •   Robin Kanters    7 年前

    不用每次用户点击Refesh按钮时都创建一个新的Fragment,您只需在MyFragment类中创建一个refreshMethod,并使用MyFragmentation的对象从Parent调用该方法,如下所示:

    Fragment fragment =  new MyFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(resId, fragment, "tag");
    transaction.addToBackStack("tag");
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    transaction.commit();
    

    单击“刷新”按钮:

    fragment.refreshList();//Create this refresh List method in you MyFragment class
    

    在refreshList方法中,您可以通知列表

    public void refreshList(){
    //update the list as per your needs
    }