Еще один способ приготовить список через AsyncTask

в 17:13, , рубрики: android, asynctask, Разработка под android, метки: ,

На днях стоял перед необходимостью решить тривиальную в общем-то задачу, заполнить ряд списков на основании элементов, загружаемых по сети. Естественно, что такие, потенциально медленные, действия нельзя выполнять в главном потоке. На помощь приходит 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js