Android 安卓&x27;FragmentManager已在执行事务';当notifydatasetchanged在ui线程上运行时

Android 安卓&x27;FragmentManager已在执行事务';当notifydatasetchanged在ui线程上运行时,android,android-fragments,android-recyclerview,android-viewpager,Android,Android Fragments,Android Recyclerview,Android Viewpager,我将表格布局与查看页面一起使用。我的选项卡布局中有两个选项卡,它们都有相同片段对象的不同实例。两个片段也有相同的回收器视图布局 问题:在取回服务器对象后加载整个活动时,我试图用新对象填充两个选项卡视图,但出现以下错误: java.lang.IllegalStateException: FragmentManager is already executing transactions 。因此,在我的主要活动中: public class MyMainActivity extends Fragm

我将表格布局查看页面一起使用。我的选项卡布局中有两个选项卡,它们都有相同片段对象的不同实例。两个片段也有相同的回收器视图布局

问题:在取回服务器对象后加载整个活动时,我试图用新对象填充两个选项卡视图,但出现以下错误:

java.lang.IllegalStateException: FragmentManager is already executing 
transactions
。因此,在我的主要活动中:

public class MyMainActivity extends FragmentActivity {
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private MyAdapter adapter;
    private MyFragment fragmentA;
    private MyFragment fragmentB;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);

    tabLayout = (TabLayout)findViewById(R.id.tab_layout);
    viewPager = (ViewPager)findViewById(R.id.view_pager);
    adapter = new MyAdapter(getSupportFragmentManager(), new 
ArrayList<>(), new ArrayList<>());

    // Instantiate the fragments here
    adapter.addFragment(....A, "Title A");
    adapter.addFragment(....B, "Title B");
    .....
    .....
    .....
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);
    }

    public void refreshPage() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // This line crashes
                adapter.notifyDataSetChanged();
            }
        });
    }
}
公共类MyMainActivity扩展了FragmentActivity{
私人摊位摊位;
私人视页机视页机;
专用MyAdapter适配器;
私有myfragmenta;
私有myfragmentb;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.my_活动);
tabLayout=(tabLayout)findviewbyd(R.id.tab\u布局);
viewPager=(viewPager)findViewById(R.id.view\u pager);
adapter=new MyAdapter(getSupportFragmentManager(),新建
ArrayList(),新的ArrayList());
//在这里实例化片段
adapter.addFragment(…A,“标题A”);
adapter.addFragment(…B,“标题B”);
.....
.....
.....
viewPager.setAdapter(适配器);
tabLayout.setupWithViewPager(viewPager);
}
公共网页(){
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//这条线坏了
adapter.notifyDataSetChanged();
}
});
}
}
我尝试使用getChildFragmentManager,但我不能,因为您需要通过片段对象调用它我不能显示太多代码,因为大部分代码是专有的,我必须使代码尽可能通用。

当我注释掉崩溃的行时,除非我滚动,否则第一个选项卡的回收器视图不会刷新。
,而第二个选项卡根本不会刷新。以前有人有过同样的问题吗?你是怎么解决的


p.S我没有使用任何FragmentManager或事务,因此我不确定它为什么会给我这个例外。

可能已经在@TylerV中解决了。是的,我尝试了那里的大多数建议,以及其他类似的问题,这就是为什么我现在问自己的问题。正如我提到的,childFragmentManager()需要首先将片段实例附加到活动…提供更多堆栈跟踪。