0

コードに問題があります。asynctask を使用して Web から JSON オブジェクトをダウンロードし、それをリストに挿入しています。

JSONをダウンロードする部分は「バックグラウンドで」行われ、そのオブジェクトをOnprogressUpdate()メソッドの配列に入れます。次に、onPostExecute()アダプタを設定するためにメソッドが呼び出されます。

onPostExecute()しかし、が before と呼ばれるため、これはうまくいかないようですdoInBackground()。なんで?

これが私のコードです:

   public class getListData extends AsyncTask<Void, Song, Long>{

        @Override   
        protected Long doInBackground(Void... params)
        {
            int state =0;
            AsyncHttpClient client = new AsyncHttpClient();

            client.get("http://192.168.1.9:8080/", new JsonHttpResponseHandler() {

                @Override
                public void onSuccess(JSONArray jsonArray) {
                    System.out.println("Successo");

                for (int i = 0; i < jsonArray.length(); i++)
                {
                    JSONObject jsonObject = null;
                try {
                    jsonObject = jsonArray.getJSONObject(i);
                    System.out.println("Leggo il vettore di json");
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                        Log.e("canta tu", ""+e);
                        e.printStackTrace();
                }

                String Prezzo = null;

                try {

                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                String Titolo = "";
                String ImgUrl="";
                String Genere = null;
                int Difficult = 0;
                String Autore = null;

                try {
                    Titolo =  jsonObject.getString("name"); // per la chiave name,l'informazine sul titolo
                    Autore = jsonObject.getString("artist"); //per l'autore
                    Genere = jsonObject.getString("genre"); //per il genere
                    Difficult = jsonObject.getInt("difficult"); //per la difficoltà
                    ImgUrl = jsonObject.getString("image_url"); //sarà image_url
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                Song t = new Song(Titolo, Autore, Genere, Prezzo, Difficult, ImgUrl);
                System.out.println("inserisco " + Titolo); 
                publishProgress(t);
            }
        }   

        public void onFailure(Throwable e, JSONObject errorResponse){

            System.out.println("error : " + errorResponse);
        }
    });


     return (long) image_details.size(); //the size is 0 because it's called before the onProgressUpdate method

}

        @Override
            protected void onProgressUpdate(Song... values)
            {
                for (Song song : values)
                {
                    image_details.add(song);
                }


            }

        protected void onPostExecute(Long bb) {
            System.out.println("download finished " +bb);
            lv1.setAdapter(new CustomListAdapterLele(getApplicationContext(), image_details));
         }

        }

誰でも間違っていることを指摘できますか。

ありがとう

4

3 に答える 3

3

呼んでいると思います

HttpClient httpClient = new DefaultHttpClient(); instead of AsyncHttpClient client = new AsyncHttpClient();

仕事をする必要があります。

于 2013-06-20T09:14:52.730 に答える
0

AsyncTask内にがありAsyncTaskます。

client.get("http://192.168.1.9:8080/", new JsonHttpResponseHandler()

これは でありasyncCall、待機せず、プログラムはonPostExecute()この行の直後にすぐに進みます。

間違った実装AsyncTask

クイック ソリューションは、AsyncTask を削除してこれを呼び出し、ハンドラーを使用して UI の更新を行うだけですUIThreadonSuccess

于 2013-06-20T09:25:34.237 に答える