2015-07-06 4 views
1

Я пытаюсь получить метод onPostExecute(), вызванный после завершения метода doInBackground(), а затем передал пользовательский arrayList<ItemDTO> активности карты, но метод onPostExecute не вызывается. Я не получаю вывод в Logcat как asign, который был вызван. Как я могу это исправить?AsyncTask: onPostExecute не вызывается

Я отлаживал его, и я могу видеть данные в объекте данных ArrayList.

Я ценю любую помощь.

GetLLRD класс

public class GetLLRD { 
    Context mContext; 

    public void post_selected(String json, Context context) { 
     new MyAsyncTask().execute(json); 
     context = this.mContext; 
    } 

    class MyAsyncTask extends AsyncTask<String, Integer, List<ItemDTO>> { 


     @Override 
     protected List<ItemDTO> doInBackground(String... params) { 

      . 
      . 
      . 
      . 

       Gson gson = new Gson(); 
       Type listType = new TypeToken<List<ItemDTO>>() { 
       }.getType(); 
       ArrayList<ItemDTO> data = gson.fromJson(sb.toString(), listType); 
      . 
      . 
      . 
      .  


      return data; 

     } 

     protected void onPostExecute(ArrayList<ItemDTO> result) { 

      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        new MyAsyncTask().execute(); 
        System.out.println("The method onPostExcute() in GETLLRD class was invoked again"); 
       } 
      }, 1*30 * 1000); 

      if (result != null) { 
       Intent intent = new Intent(mContext, Map.class); 
       intent.putExtra("list",result); 
       mContext.startActivity(intent); 

      }else{ 
       Log.e("123", "Avoiding null pointer, the dat is null in the GETLLRD class!!!"); 
      } 

     } 

    } 
} 

MapDataJSON класс с внутренним классом ItemDTo, который мне нужно, чтобы получить данные из строки JSON, что я получаю от сервера.

public class MapDataJSON { 
    ArrayList<ItemDTO> items; 

    public MapDataJSON(ArrayList<ItemDTO> items) { 
     super(); 
     this.items = items; 
    } 

    public ArrayList<ItemDTO> getItems() { 
     return items; 
    } 

    public void setItems(ArrayList<ItemDTO> items) { 
     this.items = items; 
    } 

    public static class ItemDTO implements Serializable { 
     private static final long serialVersionUID = 1L; 
     double latitude; 
     double longitude; 
     int route; 
     String direction; 

     public ItemDTO(double latitude, double longitude, int route, 
       String direction) { 
      super(); 
      this.latitude = latitude; 
      this.longitude = longitude; 
      this.route = route; 
      this.direction = direction; 
     } 

     public double getLatitude() { 
      return latitude; 
     } 

     public double getLongitude() { 
      return longitude; 
     } 

     public int getRoute() { 
      return route; 
     } 

     public String getDirection() { 
      return direction; 
     } 

     public void setLatitude(double latitude) { 
      this.latitude = latitude; 
     } 

     public void setLongitude(double longitude) { 
      this.longitude = longitude; 
     } 

     public void setRoute(int route) { 
      this.route = route; 
     } 

     public void setDirection(String direction) { 
      this.direction = direction; 
     } 
    } 

} 
+0

Почему вы называете 'MyAsyncTask' снова из' onPostExecute', из 'Handler '? – TDG

+0

Поскольку я хочу обновлять данные в своей карте каждые 30 секунд? Я не знаю, правильный ли подход? – MrPencil

+0

Здесь я вижу несколько проблем, включая утечку памяти. Я бы использовал 'alarmManager'. Я также предполагаю, что вы захотите запустить его в качестве фоновой службы. Установите будильник внутри службы и используйте 'onPostExecute', чтобы уведомить будильник о том, что текущая задача выполнена, и запустить другой цикл. – TDG

ответ

1

Ваш фактически не отменяя правильный метод подписи AsyncTask

должно быть

protected void onPostExecute(List<ItemDTO> result) 

, указав ArrayList вы меняющийся сигнатуру метода. Вот почему полезно использовать аннотацию Override, поскольку ваш идеал или компилятор скажет вам, что подпись метода не соответствует.

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