2013-06-20 4 views
0

У меня проблема с моим кодом. Я использую asynctask для загрузки объекта JSON из Интернета и вставки его в список.Asynctask, первый вызов «onPostExecute» и после «doInBackground»

Часть была загружена JSON выполнена «в фоновом режиме», а затем я помещаю этот объект в массив в методе OnprogressUpdate(). Затем выполняется вызов метода onPostExecute() для установки адаптера.

Но это не работает, потому что onPostExecute() вызывается до 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)); 
     } 

     } 

Может ли один отметить, что не так.

Благодаря

+1

onPostExecute не вызывается перед doInbackground(). проверить документы http://developer.android.com/reference/android/os/AsyncTask.html проверить тему в разделе 4 шага – Raghunandan

+1

Я не уверен, что AsyncHttpClient, но судя по его имени, он асинхронно выбирает JSON. Таким образом, метод doInBackground не блокирует и не заканчивает работу с асинхронным запросом, запущенным в каком-то другом потоке (возможно). Используйте 'DefaultHttpClient' или' HttpUrlConnection', и вы должны быть хорошими. – Akash

+0

@ Raghunandan Я знаю, что onPostExecute обычно после doInBackGround. Проблема в том, что она работает раньше. – Lele

ответ

1

onPostExecute() не вызывается до doInbackground() это не может произойти Просто используйте этот JSON парсер и только передать его URL-адрес страницы, чтобы получить JSON от как

jsonobject = JSONParser 
      .getJSONfromURL("http://10.0.2.2/myapi/products.php"); 

затем разобрать JSON объект, как вам нравится

public class JSONParser { 

    public static JSONObject getJSONfromURL(String url){ 
     InputStream is = null; 
     String result = ""; 
     JSONObject jObj = null; 

     // Download JSON data from URL 
     try{ 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(url); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 

     }catch(Exception e){ 
       Log.e("log_tag", "Error in http connection "+e.toString()); 
     } 

     // Convert response to string 
     try{ 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
       } 
       is.close(); 
       result=sb.toString(); 
     }catch(Exception e){ 
       Log.e("log_tag", "Error converting result "+e.toString()); 
     } 

     try{ 

      jObj = new JSONObject(result);    
     }catch(JSONException e){ 
       Log.e("log_tag", "Error parsing data "+e.toString()); 
     } 

     return jObj; 
    } 
} 
+0

И если мне нужно загрузить json-массив, а не только json-объект? – Lele

+1

используйте функцию getJSONArray –

3

Я думаю, называя

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

Если делать job.Hope это помогает

+0

Я не могу работать с json без asyncHttpClient, потому что у него есть весь метод. Я пытаюсь использовать 'HttpClient httpClient = new DefaultHttpClient () \t \t \t \t \t \t ((AsyncHttpClient) HTTPClient) .get ("http://192.168.1.9:8080", новый JsonHttpResponseHandler() { \t \t \t \t ... ' Но Offcourse это не работает, потому что 're исключения исключений класса 06-20 08: 10: 22.560: E/AndroidRuntime (2851): вызвано: java.lang.ClassCastException: org.apache.http.impl.client.DefaultHttpClient не может быть добавлено в com.loopj .android.http.AsyncHttpClient – Lele

0

У вас есть AsyncTaskAsyncTask внутри.

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

Это asyncCall, он не ожидает, и программа переходит к immedialtely onPostExecute() только после этой линии.

НЕПРАВИЛЬНОЕ ОСУЩЕСТВЛЕНИЕ от AsyncTask.

Быстрого решение может быть просто удалить AsyncTask и называют это в UIThread и onSuccess делать обновление пользовательского интерфейса с помощью какого-то обработчика.

+0

вы можете написать некоторую строку кода. i'm abaist – Lele

Смежные вопросы