2012-01-26 20 views
5

Tengo 6 tipos diferentes de List resultados después de completar AsyncTask. Y los resultados de List deben devolverse a Activity. Por ejemplo: List<A>, List<B>, List<C>, List<D>, List<E> y finalmente List<F>.Cómo devolver una lista anónima o ArrayList en AsyncTask en Android

Ésta es mi 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; } 
} 

que llamaré AsyncTask así:

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

Sabes, debo señalar el tipo de retorno (Resultado) entre <> etiquetas. Si elijo un tipo específico para List, no funciona para otros tipos.

De hecho, ya he intentado devolver List<Object> y solo List tipos. Pero no funcionó.

No quiero usar 6 diferentes Async. ¿Es posible resolver esto con un solo AsyncTask? Supongo que necesito una lista anónima o algo similar, no estoy seguro. ¿Alguien puede explicar esto?

+0

Puede pasar por alto <>, que no será un error, simplemente le avisa. – kosa

+0

Quiere decir que debería usar esta definición: 'AsyncTask '. Si es así, ¿cuáles serán los tipos de devolución? Ya devolví todos los tipos como una Lista normal, recibí un error de NullException. –

+0

Publicar stacktrace aquí, sospecho que el NullPointer que está recibiendo podría ser de otro lado. – kosa

Respuesta

9

En primer lugar, debo señalar que la secuencia en la que está obteniendo la lista es no correcta. Permítanme demostrar:

// 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(); 

Editar: Ahora que usted ha incluido lo que desea que ver con la lista de resultados, aquí es cómo deberá modificar su onPostExecute método:

@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 
} 

Así para resumir, si necesita hacer algo más con las listas devueltas (además de imprimir su tamaño), por ejemplo comparar, imprimir elementos, etc., debe hacerlo en el método onPostExecute.

+0

Perdón por error de sintaxis. Por supuesto, tiene que ser task.getResultList(). Corregido ahora. Y tienes razón, es temprano para el método getResultList(). ¿Cómo puedo llamar? –

+1

@OgulcanOrhan Tal como lo señalé en su pregunta [anterior] (http://stackoverflow.com/a/9019395/1101070), generalmente desea utilizar el método 'onPostExecute' de su AsyncTask para _hacer lo que sea que necesite para hacer_ con la lista (s). Edite su pregunta para incluir lo que _do_ con 'task.getResultList()' y le puedo dar una mejor respuesta. –

+0

Actualizado 'doInBackground' y' onPostExecute'. Espero que esté claro ahora. –

2

Dependiendo de los contenidos de la lista (Qué son A, B, C, etc.), es posible que pueda hacer una interfaz para ellos.

Así que si A, B, C, etc. son objetos, puede hacer una interfaz que llamamos ListContentInterface. Cada uno de sus elementos debe implementar el ListContentInterface. A continuación, puede señalar el tipo como:

List<ListContentInterface>. 

Después de que a continuación, puede probar lo que el contenido de la lista es en realidad, tomando el primer elemento de la lista, y la comprobación de su clase:

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

Si los objetos tienen algún método en común, debe especificarlos en la interfaz. Si tienen TODOS los métodos en común, puede usar la lista List directamente, sin probar la clase de los objetos (ya que todos pueden hacer lo que define la interfaz).

Espero que esto tenga algún sentido para usted. Puede que no sea el mejor uso de las interfaces o la mejor solución, pero podría resolver su problema.

+0

Sí, puedo hacer una interfaz para estos 6 objetos diferentes, y lo haré. Pero, ¿qué cambiará? No pude entender los próximos pasos. –

+2

Cuando tiene todos los elementos en una interfaz, puede crear una lista que contenga los objetos que implementan esa interfaz. De esta forma puede usar el mismo tipo de lista para todos sus objetos. Después de eso, si necesita hacer algo específico para los diferentes tipos de elementos, puede simplemente sacar los elementos de la lista y probar qué clase son, antes de hacerles la lógica específica del elemento. –

0

Estoy solucionando este tipo de problema usando execute(). Get();

Ejemplo

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; 
      } 
    } 
Cuestiones relacionadas