片段加载数据太慢

Posted

技术标签:

【中文标题】片段加载数据太慢【英文标题】:Fragments load data too slow 【发布时间】:2016-02-09 17:06:57 【问题描述】:

我正在开发一个完全基于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!");
    



【问题讨论】:

为每个网络请求创建一个asynctask,并以.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 开头。这允许它们同时加载。 @ColinGillespie 你的意思是我应该把new FetchAllData(getActivity(), 2).execute();改成new FetchAllData(getActivity(), 2).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 是的,应该这样做。 plain execute() 将所有请求添加到队列中,一次执行一个。 【参考方案1】:

AsyncTask 上调用execute() 会将其添加到您的所有AsyncTask 共享的队列中。这意味着每次向服务器发出一个请求。相反,将您的任务添加到线程池中,您可以同时执行许多任务。

myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

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

【讨论】:

我接受它作为答案,因为它适用于我的整个应用程序。 它确实提升了 API 请求和应用程序的速度,谢谢 :)【参考方案2】:

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

Android 库 "Volley" 非常有助于减少耗时的 api 调用问题。因为它在自己的线程和自己的异步队列上工作。

这是一个如何使用截击的示例。

https://github.com/ogrebgr/android_volley_examples

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

【讨论】:

Volley 可以提高大约毫秒的速度。我已经通过 Colin Gillespie 的回答解决了这个问题。 :-) 好的,兄弟。可能我会尝试按照 Colin Gillespie 的建议使用。 是的,您也应该尝试一次。顺便说一句,感谢您分享您的经验。【参考方案3】:

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

【讨论】:

以上是关于片段加载数据太慢的主要内容,如果未能解决你的问题,请参考以下文章

DBeaver中的Oracle db表数据加载太慢

压缩请求数据(优化页面加载太慢之一)

内部连接工作太慢 - 只在 phpmyadmin 中显示加载标签

android webview加载太慢怎么解决

重新加载时刷新片段

jQuery 数据表插件太慢 - 需要更换