2011-05-13 57 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