在单独的线程中添加子片段

时间:2016-03-23 03:34:42

标签: android multithreading android-fragments

我在将我的Android应用中的子片段添加到另一个片段时遇到了问题。

在父片段中我有这样的东西:

    @Override
    public View onCreateView(blah) {
        Thread initializeStateThread = new Thead() {
            public void run() {
                // Make some requests to get some data that determines
                // which child fragment to display
                state = // Some state that corresponds to a child frag

                // Method that set's the child fragment based on |state|
                setChildFragment(state);
            }
        } 
        initializeStateThread.start()

        // Do a bunch of other stuff

        return view;
    }

    setChildFragment(State state) {
        Fragment fragment = null;
        switch (mState) {
            case CASE_1:
                fragment = new DriverFindSpotFragment();
                break;
            case CASE_2:
                fragment = new DriverNavigationFragment();
                break;
            case CASE_3:
                fragment = new DriverArriveSpotFragment();
                break;
        }

        getActivity().runOnUiThread(new Runnable() {
        @Ovverride
        public void run() {
            getChildFragmentManager().beginTransaction().
               replace(R.id.driver_fragment_container, fragment).commit();
        };
    }

但是,这只占50%的时间。儿童片段的其他50%的时间都没有出现(没有错误或任何事情)。我认为问题与我在尝试在onCreateView上返回父视图后添加子片段这一事实有关。

我注意到如果我强制主线程休眠一两秒,问题就会消失(我假设因为在这种情况下返回视图之前子片段已设置)。

有没有人遇到过类似的问题?或者任何人都可以证实我的理论为什么会出现这个问题?

3 个答案:

答案 0 :(得分:0)

您可以尝试按照以下方法在片段中定义它并替换为位置/状态

public void displayView(int position) {
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new FormFragment();
        break;
    case 1:
        fragment = new HomeFragment();
        break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getChildFragmentManager();
        FragmentTransaction transaction = fragmentManager
                .beginTransaction();
        if (position != 0)
            // transaction.addToBackStack("back");
            transaction.replace(R.id.main_ll_container, fragment).commit();
    } else {
        Log.e("MainActivity", "Error in creating fragment");
    }
}

答案 1 :(得分:0)

尝试在主线程中添加Fragment事务。

喜欢这样:

runOnUiThread(new Runnable() {
        @Override
        public void run() {
            getChildFragmentManager().beginTransaction().replace(R.id.driver_fragment_container, fragment).commit();
        }
    });

答案 2 :(得分:0)

在阅读评论和其他答案后,我不确定实际问题是什么以及在哪里。

而不是:

getActivity().runOnUiThread(new Runnable() {
     @Ovverride
        public void run() {
     }
});

使用:

new Handler(Looper.getMainLooper()).post(new Runnable() {
     @Ovverride
        public void run() {
     }
});

这只是一个疯狂的猜测,很可能会起作用。