воскресенье, 5 мая 2013 г.

Подгрузка категорий через AsyncTask

Сегодня как и обещал хотел посвятить статью работой с AsyncTask. AsyncTask - это класс который предназначен для выполнения операций отдельно от UI потока и передача результатов выполнения в основной поток.
Продолжим реализацию CategoryActivity , мы хотим подгрузить категории и отобразить их в ListView.


 private class AsyncCaller extends AsyncTask<Void, Void, Void> {  
           ProgressDialog pdLoading = new ProgressDialog(CategoryActivity.this);  
           @Override  
           protected void onPreExecute() {  
                super.onPreExecute();  
                pdLoading.setMessage("\tЗагрузка...");  
                pdLoading.show();  
           }  
           @Override  
           protected Void doInBackground(Void... params) {  
                api = new API();  
                categoriesArr = api.getCategoryQuiz();  
                Log.d("size", categoriesArr.size() + "");  
                for (int i = 0; i < categoriesArr.size(); i++) {  
                     Map<String, String> category = new HashMap<String, String>();  
                     category.put("category_id",  
                               String.valueOf(categoriesArr.get(i).getCategoryId()));  
                     category.put("category_name", categoriesArr.get(i)  
                               .getCategoryName());  
                     categoryList.add(category);  
                }  
                return null;  
           }  
           @Override  
           protected void onPostExecute(Void v) {  
                pdLoading.dismiss();  
                SimpleAdapter sAdapter = new SimpleAdapter(CategoryActivity.this,  
                          categoryList, android.R.layout.simple_list_item_1,  
                          new String[] { "category_name" },  
                          new int[] { android.R.id.text1 });  
                lvCategory.setAdapter(sAdapter);  
           }  
      }  

Как видим данный класс имеет три основных метода onPreExecute(выполняется перед doInBackground, имеет доступ к UI), doInBackground(выполняется в новом потоке, здесь мы и выполняем основную работу), onPostExecute(после выполнения doInBackground,не выполняется если AsyncTask отменен).
В нашем примере мы получаем данные в doInBackground и onPostExecute создаем SimpleAdapter для ListView. Затем в onCreate запускаем наш AsyncTask и делаем обработчик для ListView :


 @Override  
      protected void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
           setContentView(R.layout.category);  
           lvCategory = (ListView) findViewById(R.id.lvCategories);  
           lvCategory.setOnItemClickListener(new OnItemClickListener() {  
                @Override  
                public void onItemClick(AdapterView<?> parent, View view,  
                          int position, long id) {  
                     Toast.makeText(getApplicationContext(),  
                               categoryList.get(position).get("category_id"),  
                               Toast.LENGTH_SHORT).show();  
              }  
           });  
           new AsyncCaller().execute();  
      }  

В общем как-то так . Это лишь небольшая часть информации которая посвящена работе с AsyncTask , но и ее будет достаточно для выполнения большинства тривиальных задач. 

Комментариев нет:

Отправить комментарий