【问题标题】:Populating a ListView w/ AsyncTask使用 AsyncTask 填充 ListView
【发布时间】:2011-05-13 03:33:19
【问题描述】:

这可能不是很优雅,但我想做的是连接到 Web 服务,获取 JSON,解析它,从中创建一个对象,将该对象添加到 ArrayList,然后使用该 ArrayList填充我的 ListView。

我正在尝试使用 AsyncTask 完成所有这些工作。

总结:doInBackgroud 接受一个 url 的字符串,用它来连接一个 web 服务。我将 JSON 数据作为字符串获取,对其进行解析,从数据中构造一个新对象,然后将其添加到 ArrayList。然后在onPostExecute 中,我尝试使用利用我的ArrayList 的ArrayAdapter 设置listadapter。

这是我所拥有的:

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&lt;String,Void,ArrayList&lt;Offer&gt;&gt;.doInBackground(String...)"

其次,在我的doInBackGround Override 上,我得到:The method doInBackGround(String...) of type AllOffersListActivity.CreateArrayListTask must override or implement a supertype method

我在这里错过了什么?

【问题讨论】:

  • 为此,我必须这样做String before = writer.toString(); String after = before.substring(1, before.length()-2); return after;

标签: android android-asynctask


【解决方案1】:

这只是一个小错字;应该是doInBackground 而不是doInBackGround

【讨论】:

  • 哈哈。我总是这样做!现在,我遇到了另一个问题。我的 ListView 没有填充 :( 我曾假设当我使用 Offer 对象的 ArrayList 时,我的 Offer 类的 toString 方法会自动被调用。我错了吗?
  • @LuxuryMode 你在看什么?你确定你的 ArrayList 被正确填充了吗?
  • ProgressDialog 关闭后,活动不显示任何内容。但是不,我不确定首先是否正确填充了 ArrayList。最简单的方法是什么?只需添加一个日志?
  • 这里好像出了点问题。这是日志:pastebin.com/5ngJWBKS
  • 糟糕,这是错误的日志。这是正确的:pastebin.com/qxjKaKxS 我认为问题在于 JSON 文件包含多个对象。如何遍历所有这些并创建多个 Offer 对象?
【解决方案2】:

@LuxuryMode 你在doInBackGround上犯了错误

正确的拼写是doInBackground

asynctask 必须实现doInBackground 方法,因此它无法识别此方法,因为方法名称错误,因此它会给您错误

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

【讨论】:

  • 谢谢!现在新问题。在 AsyncTask 运行后,我的 ListView 没有被填充:(
  • 表示您面临哪个问题?您的列表视图是空白还是有任何错误?
  • java.lang.NoClassDefFoundError: 你得到这个错误意味着你没有成功连接一个类尝试打印响应值并检查值
  • 糟糕,这是错误的日志。这是正确的:pastebin.com/qxjKaKxS 我认为问题在于 JSON 文件包含多个对象。如何遍历所有这些并创建多个 Offer 对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多