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);
}
}