2011-05-13 10 views
10

To prawdopodobnie nie jest zbyt eleganckie, ale próbuję połączyć się z usługą sieciową, pobrać JSON, przeanalizować go, utworzyć obiekt z niego, dodać ten obiekt do ArrayList, a następnie użyj tej tablicy ArrayList do zapełnienia mojego ListView.Wypełnianie listView w/AsyncTask

Próbuję zrobić to wszystko z AsyncTask.

PODSUMOWANIE: doInBackgroud pobiera ciąg adresu URL, używa go do łączenia się z usługą sieciową. Otrzymuję dane JSON jako ciąg, analizuję je, konstruuję nowy obiekt poza danymi i dodajemy do ArrayList. Następnie w onPostExecute próbuję ustawić listadapter przy użyciu ArrayAdapter, który wykorzystuje moją ArrayList.

Oto co mam:

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 ""; 
     } 

    } 

} 

widzę dwa błędy. Jednym z nich jest na mojej prywatnej klasy Async: "The type AllOffersListActivity.CreateArrayListTask must implement the inherited abstract method AsyncTask<String,Void,ArrayList<Offer>>.doInBackground(String...)"

Po drugie, w moim doInBackGround Override, otrzymuję: The method doInBackGround(String...) of type AllOffersListActivity.CreateArrayListTask must override or implement a supertype method

Co ja tu brakuje?

+0

aby to działało, musiałem zrobić przed 'String = writer.toString(); \t \t \t Ciąg po = before.substring (1, before.length() - 2); \t \t \t powrót po; ' – LuxuryMode

Odpowiedz

7

To tylko mała literówka; powinien być doInBackground zamiast doInBackGround.

+0

LOL. Zawsze to robię! Teraz mam inny problem. Mój ListView nie wypełnia się :(Przyjąłem, że kiedy używam obiektów ArrayList of Offer, metoda toString klasy Offer będzie automatycznie wywoływana. Czy jestem w błędzie? – LuxuryMode

+0

@LuksusowyMode Co widzisz? Czy jesteś pewien, że twoja tablica ArrayList jest poprawnie Wypełnione? –

+0

Aktywność nic nie pokazuje po odrzuceniu ProgressDialog.Ale nie, nie jestem pewien, czy ArrayList jest prawidłowo wypełniony, co jest najłatwiejsze do opowiedzenia? Wystarczy dodać dziennik? – LuxuryMode

2

@LuxuryMode zrobiliście błąd na doInBackGround

poprawna pisownia jest doInBackground

asynctask muszą wdrożyć doInBackground sposób więc nie uznają tę metodę ze względu na złą nazwę metody więc to daje błąd

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

Dzięki! Nowy problem n ow. Po uruchomieniu AsyncTask, mój ListView nie jest wypełniony :( – LuxuryMode

+0

Znaczy, który problem napotykasz? Jest pusty widok listy lub jakikolwiek błąd? – Dharmendra

+0

Puste i tutaj jest dziennik: http://pastebin.com/5ngJWBKS – LuxuryMode