Android 等待片段添加到UI中

Android 等待片段添加到UI中,android,multithreading,android-fragments,Android,Multithreading,Android Fragments,在我的应用程序中,在横向模式下,我需要附加两个片段。为了做到这一点,第二个片段需要等到第一个片段被附加(添加)后再添加。原因是第一个片段需要执行第二个片段需要的函数。我通过一个线程实现了这一点,但在本例中,它只等待指定的时间,然后再附加第二个片段,如果第一个片段没有在给定的时间内附加,应用程序将崩溃,因为第二个片段没有必要的数据 有没有比下面的代码更好的实践(例如,等待第一个片段被附加,并且在特定的时间间隔内没有) 非常感谢 我需要在第一个片段中执行的处理程序: @SuppressLint("H

在我的应用程序中,在横向模式下,我需要附加两个片段。为了做到这一点,第二个片段需要等到第一个片段被附加(添加)后再添加。原因是第一个片段需要执行第二个片段需要的函数。我通过一个线程实现了这一点,但在本例中,它只等待指定的时间,然后再附加第二个片段,如果第一个片段没有在给定的时间内附加,应用程序将崩溃,因为第二个片段没有必要的数据

有没有比下面的代码更好的实践(例如,等待第一个片段被附加,并且在特定的时间间隔内没有)

非常感谢

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

@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();
@suppressint(“HandlerLeak”)
受保护的无效loadAccountList(){
LoadAccountList loadAccountListThread=新的LoadAccountList(新处理程序(){
@抑制警告(“未选中”)
公共无效handleMessage(消息消息消息){
开关(msg.what){
案例加载\u成功\u代码:
items=(ArrayList)msg.obj;
打破
案例加载\u失败\u异常\u代码:
getActivity().showDialog(错误对话框);
打破
违约:
打破
}
}
});
loadAccountListThread.start();

创建片段时调用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);

        }
}

碎片生命周期在这里对您有利。根据文档,方法onStart()是“当碎片对用户可见时调用的”,因此我建议您在第一个碎片类中执行类似操作:

public void onStart() {

    super.onStart();
    ((MainActivity)getActivity()).loadSecondFragment();
}
在你的活动中:

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

瞧!试试任何一种生命周期方法,看看哪一种最适合你的目的。

首先
@suppressint(“HandlerLeak”)
是不好的。如果你不小心泄漏,你的内存就会被填满

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

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

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


您可以在这里找到文档:

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


实现您感兴趣的回调,例如,.

是的,但我需要以某种方式从活动中访问它而不是线程,但在本例中,它每次都返回null。您可能希望等到
onAttach
。然后查看如何通知活动片段为readyOk,在构造函数中添加一个侦听器,并在onCreateView中调用它。谢谢您的回答。我尝试了您的建议,但结果是一样的。第二个框架nt添加得太快,因此应用程序崩溃,因为它没有来自第一个片段的必要数据。只需一句话,调用
((MainActivity)getActivity()).loadSecondFragment()
在您执行函数之后。不仅仅是在某些生命周期方法中随机执行。@SnyersK说的非常重要,您在第一个片段中在哪里调用必要的函数?更具体地说,第一个片段包含一个查询服务器的线程,我需要第二个片段中服务器的信息。好的,那么只需等待服务器响应,然后调用
((MainActivity)getActivity()).loadSecondFragment();
,就可以了
public void loadSecondFragment() {
    if (isLandscape) {
        openSecondFragment(mIndex, R.id.rightConent);
    }    
}