На днях стоял перед необходимостью решить тривиальную в общем-то задачу, заполнить ряд списков на основании элементов, загружаемых по сети. Естественно, что такие, потенциально медленные, действия нельзя выполнять в главном потоке. На помощь приходит AsyncTask.
В моем случае все списки расположены в фрагментах. По сути они различаются только загружаемыми в них данными, что позволяет легко инкапсулировать логику работы с такими списками в класс.
public class NetworkList {
private ListFragment fragment;
private BaseAdapter adapter;
private String category;
public NetworkList(ListFragment fr) {
this.fragment=fr;
this.category=SimpleCategoryFactory.getCategory(this.fragment);
}
public String getCategory() {
return this.category;
}
public void setAdapter(BaseCategory data) {
this.adapter = CategoryAdapterFactory.getAdapter(this.fragment.getActivity(), data);
this.fragment.getListView().post(new Runnable() {
public void run() {
fragment.setListAdapter(adapter);
}
});
}
}
Единственное, на что тут стоит обратить внимание — метод setAdapter(), который возвращает результаты в главный поток
Непосредственно сам AsyncTask прост. Нам не обязательно даже следить за прогрессом — ОС сама разместит loader вместо списка, пока таск не завершит работу.
public class FillCategoryAdapterTask extends AsyncTask<NetworkList, Void, Boolean> {
protected Boolean doInBackground(NetworkList... lists) {
for (NetworkList list:lists){
list.setAdapter(RemoteConnection.getInstance().getCategoryData(list.getCategory()));
}
return true;
}
protected void onPostExecute(Boolean result) {
}
}
Осталось только создать таск в нашем наследнике ListFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
new FillCategoryAdapterTask().execute(new NetworkList(this));
return super.onCreateView(inflater, container, savedInstanceState);
}
}
Собственно вот и все.
Метод не лишен недостатков, и я с удовольствием выслушаю ваши замечания. Буду рад если кому-то мое решение окажется полезным
P.S Если считаете топик полезным — буду признателен, за помощь в восстановлении пострадавшей на днях кармы. В свою очередь обещаю впредь, воздержатся от высказывания своего мнениях в тредах с политическим подтекстом.
Автор: sl4mmer