Как вернуть анонимный список или ArrayList на AsyncTask в Android - PullRequest
5 голосов
/ 26 января 2012

У меня есть 6 различных типов List результатов после завершения AsyncTaskList результаты должны быть возвращены 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?Я думаю, мне нужен анонимный список или что-то подобное, не уверен.Кто-нибудь может объяснить это?

Ответы [ 3 ]

9 голосов
/ 26 января 2012

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

// 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.

2 голосов
/ 26 января 2012

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

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

List<ListContentInterface>.

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

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

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

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

0 голосов
/ 13 марта 2014

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