2011-05-13 23 views
10

Bu muhtemelen çok zarif değil, ancak yapmaya çalıştığım şey bir web hizmetine bağlanmak, JSON'u getirmektir, ayrıştırmak, bir nesneyi oluşturmak, bu nesneyi ArrayList ve sonra bu ArrayList ListView'imi doldurmak için kullanın.Liste Görünümü'nün Oluşturulması w/AsyncTask

Tüm bunları AsyncTask ile yapmaya çalışıyorum.

ÖZET: doInBackgroud bir url dizesini alır, bir web hizmetine bağlanmak için kullanır. JSON verilerini bir dize olarak alıyorum, ayrıştırıyorum, veriden yeni bir nesne oluşturup ArrayList'e ekliyorum. Sonra onPostExecute içinde listadapter benim ArrayList kullanan bir ArrayAdapter kullanarak ayarlamaya çalışıyorum.

İşte ne var: İki hataları görüyorum

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

    } 

} 

. Bir benim özel zaman uyumsuz sınıfına geçerli: "The type AllOffersListActivity.CreateArrayListTask must implement the inherited abstract method AsyncTask<String,Void,ArrayList<Offer>>.doInBackground(String...)"

İkincisi, benim doInBackGround Geçersiz Kılma, ben alıyorum tarih: The method doInBackGround(String...) of type AllOffersListActivity.CreateArrayListTask must override or implement a supertype method

Burada ne eksik?

+0

Bunun çalışması için, 'String before = writer.toString(); \t \t \t = Önce string = before.substring (1, önce.length() - 2); \t \t \t; – LuxuryMode

cevap

7

Sadece küçük bir yazım hatası; doInBackGround yerine doInBackground olmalıdır.

+0

LOL. Her zaman yaparım! Şimdi başka bir sorun yaşıyorum. ListView'üm population değil :(Teklif sınıfımın toString yönteminin otomatik olarak çağrılacağı Teklif nesnelerimi kullandığım zaman bunu kabul etmiştim. Yanlış mıyım? – LuxuryMode

+0

@LuxuryMode Ne görüyorsun? ArrayList'in düzgün bir şekilde aldığından emin misin? populated? –

+0

ProgressDialog görevden alındıktan sonra etkinlik hiçbir şey göstermez.Ama hayır, ArrayList ilk etapta uygun bir şekilde doldurulmuş olup olmadığından emin değilim. Söylemenin en kolay yolu nedir? Sadece bir günlüğü eklemek? – LuxuryMode

2

@LuxuryMode Eğer doInBackGround

üzerinde hata yapmış Doğru yazım doInBackground

asynctask size hata veriyor bu yüzden, çünkü yöntemin yanlış Adı bu yöntemi tanımıyor bu yüzden doInBackground yöntemi uygulamak olması gerekir

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

Teşekkürler! Yeni sorun n ah. AsyncTask çalıştırdıktan sonra, ListView'im doldurulmadı :( – LuxuryMode

+0

Hangi sorunla karşılaşıyorsunuz? Liste görünümünüz boş mu yoksa herhangi bir hata mı? – Dharmendra

+0

Blank ve işte günlük: http://pastebin.com/5ngJWBKS – LuxuryMode

İlgili konular