【问题标题】:Perform network operations before onCreateView在 onCreateView 之前执行网络操作
【发布时间】:2017-03-14 11:04:36
【问题描述】:

在我的应用程序片段中,我通过在onCreate() 方法中为服务器加载数据来设置arrayList 的值,然后我想在适配器的帮助下将该数据显示到listView,但是当我运行我的程序时它会执行onCreateView() 位于onCreate() 方法中的网络代码之前

onCreate()

ArrayList<ContactItem> contactsList = new ArrayList<ContactItem>();

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final QBUser qbUser = new QBUser("username", "password");
    QBAuth.createSession(qbUser).performAsync(new QBEntityCallback<QBSession>() {
        @Override
        public void onSuccess(QBSession qbSession, Bundle bundle) {
            Toast.makeText(getActivity(), "created", Toast.LENGTH_SHORT).show();

            for (int i = 0; i < contactName.size(); i++) {
                QBUsers.getUserByLogin(contactNumber.get(i).replaceAll(" ", "")).performAsync(new QBEntityCallback<QBUser>() {
                    @Override
                    public void onSuccess(QBUser qbUser, Bundle bundle) {
                        if (qbUser != null) {
                            final ContactItem contactItem = new ContactItem(qbUser.getFullName(), qbUser.getLogin(), R.drawable.profile);
                            contactsList.add(contactItem);

                        }

                    }

                    @Override
                    public void onError(QBResponseException e) {

                    }
                });
            }




        }

        @Override
        public void onError(QBResponseException e) {
            Toast.makeText(getActivity(), "failed " + e.toString(), Toast.LENGTH_LONG).show();
        }
    });

}

onCreateView()

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_contacts, container, false);

    ListView listView = (ListView) rootView.findViewById(R.id.contacts_listview);

    contactItemAdapter = new ContactItemAdapter(getActivity(), contactsList);
    listView.setAdapter(contactItemAdapter);

    return rootView;
}

【问题讨论】:

  • 也添加你的onCreate()
  • 那又怎样?这就是它应该如何工作的方式。网络调用所需的时间远远超过您的手机执行onCreate()omCreateView() 所需的时间。网络调用完成后更新Adapter的内容有什么问题?

标签: android fragment oncreate fragment-oncreateview


【解决方案1】:

在您的代码中,调用 onCreate() 然后调用 onCreateView()。但是您的 API 请求在后台运行,因此在服务器响应之前您的 onCreateView() 已经被调用,因此在 contactsList 中没有数据。

您可以在 onCreateView() 中移动以下行

contactItemAdapter = new ContactItemAdapter(getActivity(), contactsList);
listView.setAdapter(contactItemAdapter);

到 onSuccess(),在将数据从服务器放入 contactsList 之后,即在外部 onSuccess() 的末尾。

【讨论】:

    【解决方案2】:

    在网络响应回调中添加片段或调用片段的方法。发生这种情况是因为您的片段在网络响应之前被加载。

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 2022-10-04
      • 2019-07-20
      • 2012-02-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多