【发布时间】:2016-02-09 17:06:57
【问题描述】:
我正在开发一个完全基于Fragments 和NavigationDrawer 的项目。每个片段都从 Web 服务获取数据。单个片段需要花费大量时间来加载数据。其中一个片段是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!");
}
}
}
【问题讨论】:
-
为每个网络请求创建一个
asynctask,并以.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)开头。这允许它们同时加载。 -
@ColinGillespie 你的意思是我应该把
new FetchAllData(getActivity(), 2).execute();改成new FetchAllData(getActivity(), 2).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);? -
是的,应该这样做。 plain
execute()将所有请求添加到队列中,一次执行一个。
标签: android android-fragments android-listview android-asynctask