等到片段已添加到UI

时间:2015-02-11 14:39:33

标签: android multithreading android-fragments

在我的应用程序中,我得到了一个点,在横向模式下,我需要附加两个片段。为了做到这一点,第二个片段需要等到第一个片段被添加(添加)之后才被添加。原因是第一个片段需要执行第二个片段所需的功能。我设法通过一个线程来做到这一点,但在这种情况下它只等待指定的时间,在附加第二个片段之前,如果第一个片段在给定的时间内没有附加,应用程序将粉碎,因为第二个片段没有必要的数据。

任何更好的做法(例子)然后是下面的代码(比如等到第一个片段被连接,而且在某个时间间隔没有)? :

getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.mainContent, fragment).commit();
        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    synchronized (this) {
                        wait(1000);
                    }
                } catch (InterruptedException e) {

                }
                if (isLandscape) {
                openSecondFragment(mIndex, R.id.rightConent);
                }
            }
        };
        thread.start();

非常感谢。

我需要在第一个片段中执行处理程序:

@SuppressLint("HandlerLeak")
protected void loadAccountList() {

    LoadAccountList loadAccountListThread = new LoadAccountList(new Handler() {

        @SuppressWarnings("unchecked")
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case LOAD_SUCCESSFUL_CODE:
                items = (ArrayList<Account>) msg.obj;
                break;
            case LOAD_FAILED_IOEXCEPTION_CODE:
                getActivity().showDialog(ERROR_DIALOG);
                break;
            default:
                break;
            }
        }
    });
    loadAccountListThread.start();

4 个答案:

答案 0 :(得分:8)

碎片生命周期对您有利。根据文档,onStart()方法是“当片段对用户可见时调用”,所以我建议你在你的第一个片段类中做这样的事情:

public void onStart() {

    super.onStart();
    ((MainActivity)getActivity()).loadSecondFragment();
}

在你的活动中:

public void loadSecondFragment() {
    if (isLandscape) {
        openSecondFragment(mIndex, R.id.rightConent);
    }    
}

瞧!尝试使用任何生命周期方法,看看哪种方法最适合您的目的。

答案 1 :(得分:0)

创建片段时调用onCreateView

public static class CustomFragment extends SupportMapFragment{

        public CustomFragment() {}

        @Override
        public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
            return super.onCreateView(arg0, arg1, arg2);

        }
}

答案 2 :(得分:0)

首先关闭@SuppressLint("HandlerLeak")是不好的。如果你不小心泄漏,你的记忆就会被填满。

我的解决方案(这是个人偏好)

我喜欢使用Otto来传递消息,同时还有松耦合。 它允许您设置一个EventBus,不同的类可以简单地注册和接收他们想要的事件。 在这种情况下,您可以创建一个辅助类来加载数据,并在收到数据(或错误)时触发事件。 然后你在第二个片段中捕获这个并填充你的列表。 (在此期间,您可以显示无限期的进度条或其他内容)

这样,在加载片段之前,您不必等待接收数据。

您可以在此处找到文档:https://github.com/square/otto

答案 3 :(得分:0)

您可以通过注册FragmentLifecycleCallbacks来观察片段的创建 在FragmentManager中。

实施您感兴趣的回调,例如onFragmentAttachedonFragmentResumed