片段加载数据太慢
Fragments load data too slow
我正在做一个完全基于 Fragments
和 NavigationDrawer
的项目。每个片段都从网络服务中获取数据。单个片段在这里需要花费很多时间来加载数据。所有片段之一是 Fragment
,它有 10 多个使用 TabLayout
和 ViewPager
的片段,每个片段都在 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!");
}
}
}
我遇到了同样的问题。使用 tabLayout 时,每个 tabLayout 都引用一个唯一的片段。这为 OS 创建了很多开销,当我导航到一个选项卡时,抽屉的关闭动作很俗气。
Android 库 "Volley" 非常有助于减少耗时的 api 调用问题。因为它在自己的线程和异步队列上工作。
这里是一个如何使用 volley 的例子。
https://github.com/ogrebgr/android_volley_examples
我可以提供完整的示例代码,但这是保密协议。
我更喜欢你使用 Retrofits 概念。Retrofits Demo
在 AsyncTask
上调用 execute()
会将其添加到所有 AsyncTask
共享的问题中。这意味着每次向服务器发出一个请求。通过将任务添加到线程池,您可以同时执行许多任务。
myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
为了管理您的网络请求,通常最好使用专门为此设计的库。我个人使用 Retrofit,但其他如 Volley、RoboSpice 和 OkHttp 也是不错的选择。
我正在做一个完全基于 Fragments
和 NavigationDrawer
的项目。每个片段都从网络服务中获取数据。单个片段在这里需要花费很多时间来加载数据。所有片段之一是 Fragment
,它有 10 多个使用 TabLayout
和 ViewPager
的片段,每个片段都在 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!");
}
}
}
我遇到了同样的问题。使用 tabLayout 时,每个 tabLayout 都引用一个唯一的片段。这为 OS 创建了很多开销,当我导航到一个选项卡时,抽屉的关闭动作很俗气。
Android 库 "Volley" 非常有助于减少耗时的 api 调用问题。因为它在自己的线程和异步队列上工作。
这里是一个如何使用 volley 的例子。
https://github.com/ogrebgr/android_volley_examples
我可以提供完整的示例代码,但这是保密协议。
我更喜欢你使用 Retrofits 概念。Retrofits Demo
在 AsyncTask
上调用 execute()
会将其添加到所有 AsyncTask
共享的问题中。这意味着每次向服务器发出一个请求。通过将任务添加到线程池,您可以同时执行许多任务。
myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
为了管理您的网络请求,通常最好使用专门为此设计的库。我个人使用 Retrofit,但其他如 Volley、RoboSpice 和 OkHttp 也是不错的选择。