片段加载数据太慢

时间:2015-11-09 04:32:04

标签: android android-fragments android-listview android-asynctask

我正在开展一个完全基于FragmentsNavigationDrawer的项目。每个片段都从Web服务获取数据。单个片段需要花费大量时间来加载数据。其中一个片段是Fragment,其中包含10个以上使用TabLayoutViewPager的片段,每个片段都显示ListView中的数据,并且需要花费大量时间加载。我尝试了很多方法,最后的方法就像:

public class CommodityFragment extends android.support.v4.app.Fragment implements SearchView.OnQueryTextListener {
private boolean isViewShown = false;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (getView() != null) {
        isViewShown = true;
    } else {
        isViewShown = false;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.equity_activity, container, false);
    act = this.getActivity();
    return view;
}

public void onActivityCreated(Bundle savedInstanceState1) {
    super.onActivityCreated(savedInstanceState1);
    setHasOptionsMenu(true);
    list = (ListView) view.findViewById(R.id.list_equity);
    empty_text = (TextView) view.findViewById(R.id.empty);
    if (Utils.isNetworkAvailable(getActivity())) {
        if (catListDao.size() > 0) {
            adapter = new AdvisorsAdapter(act,R.layout.custom_equity, catListDao);
            list.setAdapter(adapter);
        } else {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // do some work here
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (!isViewShown) {
                                new FetchAllData(getActivity(), 2).execute();
                            }
                        }
                    });
                }
            }).start();
        }
    } else {
        CustomToast toast = new CustomToast(getActivity(), "There is no internet connection!");
    }

}
}

3 个答案:

答案 0 :(得分:3)

execute()上拨打AsyncTask会将其添加到您所有AsyncTask共享的聊天记录中。这意味着每次向服务器发出一个请求。通过将您的任务添加到线程池,您可以同时执行许多任务。

myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

为了管理您的网络请求,通常最好使用专为此设计的。我个人使用Retrofit,但Volley,RoboSpice和OkHttp等其他人也是不错的选择。

答案 1 :(得分:1)

我遇到了同样的问题。使用tabLayout时,每个tabLayout都引用一个唯一的片段。这为操作系统带来了很多开销,当我导航到选项卡时,抽屉的关闭动作很俗气。

Android库" Volley" 非常有助于减少耗时的API调用问题。因为它在自己的线程上运行,并且它自己的异步队列。

以下是如何使用排球的示例。

https://github.com/ogrebgr/android_volley_examples

我可以提供完整的示例代码,但它是在保密协议下。

答案 2 :(得分:0)

我更喜欢你使用Retrofits概念。Retrofits Demo