2011-05-13 59 views
10

這可能不是很優雅,但我想要做的是連接到Web服務,獲取JSON,解析它,創建一個對象,將該對象添加到ArrayList,然後使用該ArrayList來填充我的ListView。填充列表視圖w/AsyncTask

我試圖用AsyncTask來做所有這些事情。

摘要:doInBackgroud接受一個URL的字符串,用它連接到一個Web服務。我將JSON數據作爲字符串獲取,解析它,從數據中構建一個新對象,並將其添加到ArrayList。然後在onPostExecute我試圖設置listadapter使用ArrayAdapter利用我的ArrayList。

這是我有:

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

    } 

} 

我看到兩個錯誤。一個是對我的私人異步類:"The type AllOffersListActivity.CreateArrayListTask must implement the inherited abstract method AsyncTask<String,Void,ArrayList<Offer>>.doInBackground(String...)"

其次,我doInBackGround覆蓋,我越來越:The method doInBackGround(String...) of type AllOffersListActivity.CreateArrayListTask must override or implement a supertype method

缺少什麼我在這裏?

+0

爲了這個工作,我必須做'String before = writer.toString(); \t \t \t String after = before.substring(1,Untillength() - 2); \t \t \t return; after' – LuxuryMode

回答

7

這只是一個小的錯字;應該是doInBackground而不是doInBackGround

+0

LOL。我總是這樣做!現在,我遇到了另一個問題。我的ListView沒有填充:(我假設當我使用我的Offer對象的ArrayList時,我的Offer類的toString方法會自動調用。我錯了嗎? – LuxuryMode

+0

@LuxuryMode你在看什麼?你確定你的ArrayList得到正確填充? –

+0

在ProgressDialog被解僱後,該活動不會顯示任何內容。但是,不知道ArrayList是否正確地填充到了第一位。最簡單的方法是什麼?只需添加一個日誌? – LuxuryMode

2

@LuxuryMode你做了錯誤的doInBackGround

正確的拼寫是doInBackground

的AsyncTask必須實現doInBackground方法,以便使它給你的錯誤是不承認,因爲方法錯誤的名稱這種方法

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

Thanks!New problem n流。 AsyncTask運行後,我的ListView沒有被填充:( – LuxuryMode

+0

意味着你面臨哪個問題?是你的listview空白還是任何錯誤? – Dharmendra

+0

空白,這裏是日誌:http://pastebin.com/5ngJWBKS – LuxuryMode