Android - 在交换碎片之前加载片段的视图

时间:2014-08-30 03:26:51

标签: android android-fragments

我有一个活动,其中包含一个导航抽屉,当按下不同的导航项时,它会显示不同的碎片。问题是这些片段中的一个在加载时会有明显的延迟。

在我的活动onCreate方法中,我启动了一个我想要预加载每个片段的线程,以便在用户按下导航项时可以轻松交换。

我的代码看起来像这样:

public class MainActivity extends Activity {
    protected void OnCreate {
        // Get instance of Thread InitialiseNavFrags.
        InitialiseNavFrags fragmentInit = new InitialiseNavFrags();
        fragmentInit.start();
    }
    private void selectItem(position) {
        ...
        final FragmentTransaction ft = getFragmentManager().beginTransaction();
        // Wait until sportsFragment is loaded.
        while (sportsFragment == null) {
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                System.out.println("Caught InterruptedException :" + e);
            }
        }
        // Switches fragments to FavouriteFragment
        ft.replace(R.id.content_fragment, sportsFragment, "Sports");
        // Noticeable delay here
        ft.commit();
    }
    ...
    class InitialiseNavFrags extends Thread {
        public void run() {
            favouriteFragment = new FavouriteFragment();
            sportsFragment = new SportFragment();
        }
    }
}

public class SportsFragment extends Fragment {
    public View onCreateView (...) {
        // Task with noticeable delay
        return view;
    }
}

我的问题是SportFragment onCreateView在执行MainActivity selectItem之前无法执行{{1}}片段被交换,当用户按下导航项时会导致明显的延迟。

那么,是否可以初始化Fragment的视图以便没有明显的延迟?

2 个答案:

答案 0 :(得分:0)

在单独的线程上创建片段不是一个好主意;您应该优化OnCreateView

答案 1 :(得分:0)

我还没有尝试过,但我想有可能只在onCreateView中膨胀一个容器,然后在后台线程中膨胀其他视图,并在它们完成膨胀后将它们添加到该容器中。

我现在面临同样的问题。