Как вернуть анонимный список или ArrayList в AsyncTask на Android

После завершения работы AsyncTask меня есть 6 различных типов результатов. И результаты List должны быть возвращены в Activity . Например: List<A> , List<B> , List<C> , List<D> , List<E> и, наконец, List<F> .

Это мой AsyncTask :

 public class myAsync extends AsyncTask<String, String, List> { private List resultList; @Override protected List doInBackground(String... params) { //params[0] is url //params[1] is type callAPI api = new callAPI(params[0], params[1]); // According to type api decides type of List and generates return api.getJSON(); // returns a List which already parse JSON } @Override protected void onPostExecute(List result) { // Result is here now, may be 6 different List type. this.resultList = result } // returns result public List getResultList() { return this.resultList; } } 

Я буду называть AsyncTask следующим образом:

 myAsync task = new myAsync(); task.execute(params); List myList = task.getResultList(); // type is uncertain Log.d("Tag", Integer.toString(myList.size()); 

Вы знаете, я должен указать тип возврата (результат) между тегами <>. Если я выбираю конкретный тип для List , он не работает для других типов.

Действительно, я уже пытался вернуть List<Object> и только типы List . Но не работает.

Я не хочу использовать 6 разных Async . Можно ли решить эту проблему только с помощью AsyncTask ? Наверное, мне нужен анонимный список или что-то подобное не уверен. Может ли кто-нибудь объяснить это?

Во-первых, я должен указать, что последовательность, в которой вы получаете список, неверна. Позвольте мне продемонстрировать:

 // Initialize myAsync myAsync task = new myAsync(); // This will do work for some period of time, this statement DOES NOT 'block' // till myAsync completes, it will run it in the background task.execute(params); // This will return null because by the time you get here, task.execute most // likely hasn't finished yet. task.getResultList(); 

Изменить: теперь, когда вы включили то, что хотите сделать с результатом списка, вот как вы измените свой метод onPostExecute :

 @Override protected void onPostExecute(List result) { Log.d(TAG, "The returned list contains " +result.size()+ "elements"); // Do anything else you need to with the returned list here } 

Итак, чтобы суммировать, если вам нужно было сделать что-либо еще с возвращенными списками (помимо печати их размера), например, сравнить, распечатать элементы и т. Д., Вам нужно сделать это в методе onPostExecute .

В зависимости от содержимого списка (что есть A, B, C и т. Д.), Вы можете создать для них интерфейс.

Поэтому, если A, B, C и т. Д. Являются объектами, вы можете создать интерфейс, который мы называем ListContentInterface. Затем каждый из ваших элементов должен реализовать ListContentInterface. Затем вы можете указать тип как:

 List<ListContentInterface>. 

После этого вы можете проверить, что такое содержимое списка на самом деле, взяв первый элемент списка и проверив его класс:

 if(element.getClass() == ClassToTestFor.class) ... 

Если объекты имеют какие-либо общие методы, вы должны указать их в интерфейсе. Если у них есть ВСЕ общие методы, вы можете использовать список List напрямую, без тестирования для класса объектов (поскольку они все могут выполнять то, что определяет интерфейс).

Надеюсь, это имеет для вас какое-то значение. Это может быть не лучшее использование интерфейсов или лучшее решение, но это может решить вашу проблему.

Я решаю эту проблему, используя execute (). Get ();

пример

 call from activity ArrayList<String> arraylistitem= new jsonparsing(getActivity()).execute().get(); In async task public class jsonparsing extends AsyncTask<Void, Void, ArrayList<String>> { public jsonparsing(Activity activity) { this.activity = activity; arraylistitem = new ArrayList<String>(); } protected ArrayList<String> doInBackground(Void... arg0) { // Do anything else you need to with the returned list here return arraylistitem; } } 
Intereting Posts
Метод Swizzling в Android с помощью java OnNext начать другое наблюдение Пользовательский аутентификатор учетной записи. Очистка после удаления учетной записи с устройства Сервер Adb не отвечает Как проверить установленное приложение во время выполнения, чтобы предотвратить фишинг-атаку? Название панели действий исчезает при заданном стиле System.LoadLibrary (libname) сбой на чипсете Nvidia Tegra 2 (Android Samsung Tab) в коде Javacv Установить растровое изображение на фон ImageView с помощью метода imageView.setImageBitmap Как получить доступ к Камере через Bluetooth? Как разрешить ошибку Titanium «Ex … tion: Android Android -8» или Android «-2.2» в Android SDK. »На Mac под управлением OSX Lion? Обнаружить щелчок по диалоговому окну в Android Что более безопасно: внешний браузер или ChromeTab для авторизации? Что такое целое число, возвращаемое getInt (строковый ключ) в android.os.Bundle? Новый android Camera2 Api на nexus 7 Как получить фокус для EditText и перемещаться с помощью D-pad в Android TV