2011-05-13 13 views
10

Esto probablemente no es muy elegante, pero lo que estoy tratando de hacer es conectarse a un servicio web, ir a buscar el JSON, analizarlo, crear un objeto fuera de él, añadir que a un objeto ArrayList y luego usar ArrayList para llenar mi ListView.Rellenar un ListView w/AsyncTask

Estoy tratando de hacer todo esto con AsyncTask.

RESUMEN: doInBackgroud toma una cadena de una dirección URL, lo utiliza para conectarse a un servicio web. Obtengo los datos JSON como una cadena, los analizo, construyo un nuevo objeto a partir de los datos y lo agrego a ArrayList. Luego, en onPostExecute estoy tratando de configurar el adaptadordapter utilizando un ArrayAdapter que utiliza mi ArrayList.

Esto es lo que tengo:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.io.StringWriter; 
import java.io.Writer; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Arrays; 

import org.json.JSONArray; 
import org.json.JSONObject; 

import oauth.signpost.OAuthConsumer; 
import oauth.signpost.basic.DefaultOAuthConsumer; 
import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 

public class AllOffersListActivity extends ListActivity { 

    private static final String CONSUMER_KEY = "bla"; 
    private static final String CONSUMER_SECRET = "bla"; 


    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 



     new CreateArrayListTask().execute("http://example.com/sample.json"); 




    } 

    private class CreateArrayListTask extends AsyncTask<String, Void, ArrayList<Offer>> { 
     private final ProgressDialog dialog = new ProgressDialog(AllOffersListActivity.this); 

     @Override 
     protected void onPreExecute() { 
      this.dialog.setMessage("Fetching offers..."); 
      this.dialog.show(); 

     } 
     @Override 
     protected ArrayList<Offer> doInBackGround(String...urls) { 
      ArrayList<Offer> offerList = new ArrayList<Offer>(); 

      for(String url: urls) { 
       OAuthConsumer consumer = new DefaultOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); 
       consumer.setTokenWithSecret("", ""); 

       try { 

        URL url1 = new URL(url); 
        HttpURLConnection request = (HttpURLConnection) url1.openConnection(); 

        // sign the request 
        consumer.sign(request); 

        // send the request 
        request.connect(); 


        String JSONString = convertStreamToString(request.getInputStream()); 

        JSONObject jObject = new JSONObject(JSONString); 

        JSONObject offerObject = jObject.getJSONObject("offer"); 

        String titleValue = offerObject.getString("title"); 
        //System.out.println(titleValue); 

        String descriptionValue = offerObject.getString("description"); 
        //System.out.println(attributeValue); 
        JSONObject businessObject = offerObject.getJSONObject("business"); 
        String nameValue = businessObject.getString("name"); 

        Offer myOffer = new Offer(titleValue, descriptionValue, nameValue); 

        offerList.add(myOffer); 

       } catch (Exception e) { 
        e.printStackTrace(); 

       } 
      } 
      return offerList; 

     } 

     @Override 
     protected void onPostExecute(ArrayList<Offer> offerList) { 
      if(this.dialog.isShowing()) 
       this.dialog.dismiss(); 
      setListAdapter(new ArrayAdapter<Offer>(AllOffersListActivity.this, android.R.layout.simple_list_item_1, offerList));   
     } 
    } 

    private String convertStreamToString(InputStream inputStream) throws IOException { 
     if(inputStream != null) { 
      Writer writer = new StringWriter(); 

      char[] buffer = new char[1024]; 

      try { 

       Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); 

       int n; 
       while((n = reader.read(buffer)) != -1) { 
        writer.write(buffer, 0, n); 

       } 
      } finally { 
       inputStream.close(); 
      } 
      return writer.toString(); 
     } else { 
      return ""; 
     } 

    } 

} 

que estoy viendo dos errores. Uno está en mi clase asíncrono privada: "The type AllOffersListActivity.CreateArrayListTask must implement the inherited abstract method AsyncTask<String,Void,ArrayList<Offer>>.doInBackground(String...)"

En segundo lugar, en mi doInBackGround de anulación, que estoy recibiendo: The method doInBackGround(String...) of type AllOffersListActivity.CreateArrayListTask must override or implement a supertype method

qué estoy perdiendo aquí?

+0

Para que esto funcione, tuve que hacer 'String before = writer.toString(); \t \t \t cadena después = before.substring (1, before.length() - 2); \t \t \t regreso después; ' – LuxuryMode

Respuesta

7

Es solo un pequeño error; debe ser doInBackground en lugar de doInBackGround.

+0

LOL. ¡Yo siempre hago eso! Ahora, estoy teniendo otro problema. Mi ListView no está rellenando :(Había asumido que cuando utilizaba mis objetos ArrayList of Offer, el método toString de mi clase de oferta se llamaba automáticamente. ¿Estoy equivocado? – LuxuryMode

+0

@LuxuryMode ¿Qué está viendo? ¿Está seguro de que ArrayList obtiene correctamente? poblada? –

+0

la actividad no muestra nada después de la ProgressDialog es despedido. Pero no, no estoy seguro de si el ArrayList se rellena correctamente en el primer lugar. ¿Cuál es la forma más fácil de decir? Sólo tiene que añadir un registro? – LuxuryMode

2

@LuxuryMode que ha hecho error en doInBackGround

la ortografía correcta es doInBackground

AsyncTask debe tener para poner en práctica el método doInBackground por lo que no se reconoce este método debido a nombre de método para que siempre tenga errores

The method doInBackGround(String...) of type AllOffersListActivity.CreateArrayListTask must 
override or implement a supertype method 
+0

¡Gracias! Nuevo problema n Ay. ? Después de la AsyncTask corre, mi ListView no se rellena :( – LuxuryMode

+0

medio que es el problema que enfrentan es su vista de lista en blanco o cualquier error – Dharmendra

+0

en blanco y aquí está el registro:? Http://pastebin.com/5ngJWBKS – LuxuryMode