Android 使用异步任务填充ListView

Android 使用异步任务填充ListView,android,android-asynctask,Android,Android Asynctask,这可能不是很优雅,但我正在尝试连接到web服务,获取JSON,解析它,从中创建一个对象,将该对象添加到ArrayList,然后使用该ArrayList填充我的ListView 我正试图用AsyncTask完成所有这些 摘要:DoinBackground获取url字符串,并使用它连接到web服务。我以字符串的形式获取JSON数据,对其进行解析,从数据中构造一个新对象,然后将其添加到ArrayList中。然后在onPostExecute中,我试图使用利用我的ArrayList的ArrayAdapte

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

我正试图用AsyncTask完成所有这些

摘要:DoinBackground获取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 "";
        }

    }

}
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.Reader;
导入java.io.StringWriter;
导入java.io.Writer;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.array;
导入org.json.JSONArray;
导入org.json.JSONObject;
导入oauth.signpost.OAuthConsumer;
导入oauth.signpost.basic.DefaultOAuthConsumer;
导入android.app.ListActivity;
导入android.app.ProgressDialog;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.widget.ArrayAdapter;
公共类AllOffersListActivity扩展了ListActivity{
私有静态最终字符串使用者_KEY=“bla”;
私有静态最终字符串使用者_SECRET=“bla”;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
新建CreateArrayListTask()。执行(“http://example.com/sample.json");
}
私有类CreateArrayListTask扩展了AsyncTask{
private final ProgressDialog=new ProgressDialog(AllOffersListActivity.this);
@凌驾
受保护的void onPreExecute(){
this.dialog.setMessage(“获取报价…”);
this.dialog.show();
}
@凌驾
受保护的ArrayList doInBackGround(字符串…URL){
ArrayList offerList=新的ArrayList();
for(字符串url:url){
OAuthConsumer=新的默认OAuthConsumer(consumer\u密钥,consumer\u机密);
consumer.setTokenWithSecret(“,”);
试一试{
URL url1=新的URL(URL);
HttpURLConnection请求=(HttpURLConnection)url1.openConnection();
//签署请求
消费者签名(请求);
//发送请求
request.connect();
字符串JSONString=convertStreamToString(request.getInputStream());
JSONObject jObject=新的JSONObject(JSONString);
JSONObject offerObject=jObject.getJSONObject(“要约”);
String titleValue=offerObject.getString(“title”);
//系统输出打印LN(标题值);
String descriptionValue=offerObject.getString(“描述”);
//System.out.println(attributeValue);
JSONObject businessObject=offerObject.getJSONObject(“业务”);
String nameValue=businessObject.getString(“名称”);
Offer myOffer=新报价(标题值、描述值、名称值);
offerList.add(myOffer);
}捕获(例外e){
e、 printStackTrace();
} 
}
返回报价表;
}
@凌驾
PostExecute上受保护的void(ArrayList offerList){
if(this.dialog.isShowing())
this.dialog.disclose();
setListAdapter(新的ArrayAdapter(AllOffersListActivity.this,android.R.layout.simple_list_item_1,offerList));
}
}
私有字符串convertStreamToString(InputStream InputStream)引发IOException{
如果(inputStream!=null){
Writer-Writer=新的StringWriter();
char[]buffer=新字符[1024];
试一试{
Reader Reader=新的BufferedReader(新的InputStreamReader(inputStream,“UTF-8”));
int n;
while((n=读卡器读取(缓冲区))!=-1){
writer.write(缓冲区,0,n);
}
}最后{
inputStream.close();
}
返回writer.toString();
}否则{
返回“”;
}
}
}
我看到两个错误。一个是在我的私有异步类上:
“类型AllofferListActivity.CreateArrayListTask必须实现继承的抽象方法AsyncTask.doInBackground(String…)”

其次,在我的
doInBackGround
Override中,我得到:
AllOffersListActivity.CreateArrayListTask类型的doInBackGround(String…)方法必须重写或实现超类型方法


我在这里遗漏了什么?

这只是一个小的打字错误;应该是
doInBackground
而不是
doInBackground

@LuxuryMode您在
doInBackground

正确的拼写是
doInBackground

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

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

哈哈,我总是这么做!现在,我有另一个问题。我的ListView未填充:(我假设当我使用我的Offer对象的ArrayList时,我的Offer类的toString方法会被自动调用。我错了吗?@LuxuryMode你看到了什么?你确定你的ArrayList被正确填充了吗?ProgressDialog被取消后,活动不会显示任何内容。但是,不,我不确定ArrayList是否正确弹出。)最简单的方法是什么?只需添加一个日志?看起来这里出了问题。这是日志:哇,这是错误的日志。这是正确的:pastebin.com/qxjKa