0

私は、リモートサーバーとのデータシンクロを行うフラグメントを持っています。さまざまなオブジェクトインスタンスを送信する必要があり、オブジェクトごとにAsyncTaskを実装するためバックグラウンドで実行する必要があります。このAsynctaskでは、WebServiceを介してリモートサーバーに送信するデータを準備します。応答を受信すると、同じフラグメント内のサブスクライバによってキャッチされたイベントを送信します。私の問題は、最初にイベントが正しくポストされたが、次のポストでは、イベントが乗算されることです。私のコードザッツEventBusは同じフラグメント内に投稿してサブスクライブします

public class SincroFragment extends Fragment { 

    private String uid = ""; 

    private DaoSession daoSession; 

    private WebDatumApi webDatumApi; 

    private String token; 

    private int usuarioId; 

    private SharedPreferences prefs; 


    public SincroFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     // Inflate the layout for this fragment 
     View rootview = inflater.inflate(R.layout.fragment_sincro, container, false); 

     EventBus.getDefault().register(this); 

     daoSession = ((MDatumController)getActivity().getApplication()).getDaoSession(); 

     webDatumApi = ((MDatumController)getActivity().getApplication()).getApiSession(); 

     prefs = getActivity().getApplication().getSharedPreferences("MDATUM_PREFS", Activity.MODE_PRIVATE); 

     token = prefs.getString("PREF_USER_TOKEN",null); 

     usuarioId = prefs.getInt("PREF_USER_LOGED",0); 


     EncuestaDao encuestaDao = daoSession.getEncuestaDao(); 

     List<Encuesta> encuestas = encuestaDao.queryBuilder().where(EncuestaDao.Properties.Is_finished.eq(true),EncuestaDao.Properties.IsSincronized.eq(false)).list(); 
     for(int i = 0; i < encuestas.size() ; i ++){ 
      uid = UUID.randomUUID().toString()+"-"+String.valueOf(encuestas.get(i).getId())+"-"+String.valueOf(encuestas.get(i).getUsuario()); 

      Encuesta encuesta = encuestas.get(i); 
      encuesta.setTransaccion(uid); 

      encuestaDao.update(encuesta); 

      Transaccion transaccion = new Transaccion(); 
      transaccion.setEncuestaId(encuesta.getId()); 
      transaccion.setTransaccion(uid); 
      try{ 
       daoSession.insert(transaccion); 
      }catch (SQLiteConstraintException e){ 
       daoSession.update(transaccion); 
      } 

      Establecimiento establecimiento = encuestas.get(i).getEstablecimientoRelated(); 
      establecimiento.setTransaccion(uid); 

      new EstablecimientoSynchroTask().execute(establecimiento); 

     } 




     return rootview; 
    } 

    @Subscribe 
    public void onEvent(MensajesDeEvento evento){ 

     switch (evento.getDispatcher()){ 
      case "EstablecimientoTask": 
       if(evento.getEvento().equals("Success")){ 
        Encuesta encuesta = getEncuestaByTransaccion(evento.getTransaccion()); 
        Encuestado encuestado = encuesta.getEncuestadoRelated(); 
        encuestado.setTransaccion(evento.getTransaccion()); 
        new EncuestadoSynchroTask().execute(encuestado); 
       } 
       break; 
      case "EncuestadoTask": 
       if(evento.getEvento().equals("Success")){ 
        Encuesta encuesta = getEncuestaByTransaccion(evento.getTransaccion()); 
        Familia familia = encuesta.getFamiliaRelated(); 
        if(familia != null){ 
         familia.setTransaccion(evento.getTransaccion()); 
         new FamiliaSynchroTask().execute(familia); 
        }else { 
         MensajesDeEvento event = new MensajesDeEvento(); 
         event.setEvento("Success"); 
         event.setDispatcher("FamiliaTask"); 
         event.setTransaccion(evento.getTransaccion()); 
         EventBus.getDefault().post(event); 
        } 
       } 
       break; 
      case "FamiliaTask": 
       if(evento.getEvento().equals("Success")){ 
        Encuesta encuesta = getEncuestaByTransaccion(evento.getTransaccion()); 
        Agroquimicos agroquimico = encuesta.getAgroquimicoRelated(); 
        if(agroquimico!= null){ 
         agroquimico.setTransaccion(evento.getTransaccion()); 
         new AgroquimicoSynchroTask().execute(agroquimico); 
        }else{ 
         MensajesDeEvento event = new MensajesDeEvento(); 
         event.setEvento("Success"); 
         event.setDispatcher("AgroquimicoTask"); 
         event.setTransaccion(evento.getTransaccion()); 
         EventBus.getDefault().post(event); 
        } 
       } 
       break; 
      case "AgroquimicoTask": 
       if(evento.getEvento().equals("Success")){ 
        new ObtenerIdsTask().execute(evento.getTransaccion()); 
       } 
       break; 
      case "GetIdsTask": 
       if(evento.getEvento().equals("Success")){ 
        Encuesta encuesta = (Encuesta) evento.getObject(); 
        new EncuestaSynchroTask().execute(encuesta); 
       } 
       break; 

     } 


    } 

    private class EstablecimientoSynchroTask extends AsyncTask<Establecimiento,Void,Long>{ 

     @Override 
     protected Long doInBackground(Establecimiento... establecimientos) { 

      Long id = 0L; 
      final Establecimiento establecimiento = establecimientos[0]; 

      //Obtengo el archivo de la foto del establecimiento 
      File foto     = new File(establecimiento.getFoto()); 
      //preparo la parte del cuerpo del mensaje que lleva la imagen 
      RequestBody reqFile   = RequestBody.create(MediaType.parse("image/*"), foto); 
      final MultipartBody.Part body  = MultipartBody.Part.createFormData("foto",foto.getName(),reqFile); 
      //preparo el resto de las partes del mensaje 
      RequestBody nombre   = RequestBody.create(MediaType.parse("text/plain"),establecimiento.getNombre()); 
      RequestBody numero   = RequestBody.create(MediaType.parse("text/plain"),establecimiento.getNro()); 
      RequestBody posLatitud  = RequestBody.create(MediaType.parse("text/plain"),establecimiento.getPosLatitud()); 
      RequestBody posLongitud  = RequestBody.create(MediaType.parse("text/plain"),establecimiento.getPosLongitud()); 
      RequestBody regimenTenencia = RequestBody.create(MediaType.parse("text/plain"),Integer.toString(establecimiento.getRegimenTenenciaId())); 
      RequestBody regimenOtros = RequestBody.create(MediaType.parse("text/plain"),establecimiento.getRegimenOtros()); 
      RequestBody transaccion  = RequestBody.create(MediaType.parse("text/plain"), establecimiento.getTransaccion()); 

      //Instancio una llamada con las partes generadas anteriormente 
      Call<Establecimiento> establecimientoCall = webDatumApi.sincroEstablecimiento(
        "Token " + token, 
        body, 
        nombre, 
        numero, 
        posLatitud, 
        posLongitud, 
        regimenTenencia, 
        regimenOtros, 
        transaccion 
      ); 

      establecimientoCall.enqueue(new Callback<Establecimiento>() { 
       @Override 
       public void onResponse(Call<Establecimiento> call, Response<Establecimiento> response) { 
        if(response.isSuccessful()){ 
         MensajesDeEvento evento = new MensajesDeEvento(); 
         evento.setEvento("Success"); 
         evento.setDispatcher("EstablecimientoTask"); 
         evento.setTransaccion(response.body().getTransaccion()); 
         EventBus.getDefault().post(evento); 
        } 
       } 

       @Override 
       public void onFailure(Call<Establecimiento> call, Throwable t) { 

       } 
      }); 

      return id; 

     } 

     @Override 
     protected void onPostExecute(Long aLong) { 
      super.onPostExecute(aLong); 
     } 
    } 


    private class EncuestadoSynchroTask extends AsyncTask<Encuestado,Void,Boolean>{ 

     @Override 
     protected Boolean doInBackground(Encuestado... encuestados) { 

      Encuestado encuestado = encuestados[0]; 



      Call<Encuestado> encuestadoCall = webDatumApi.sincroEncuestado(
        "Token " + token, 
        encuestado 
      ); 

      encuestadoCall.enqueue(new Callback<Encuestado>() { 
       @Override 
       public void onResponse(Call<Encuestado> call, Response<Encuestado> response) { 
        if (response.isSuccessful()) { 
         MensajesDeEvento evento = new MensajesDeEvento(); 
         evento.setEvento("Success"); 
         evento.setDispatcher("EncuestadoTask"); 
         evento.setTransaccion(response.body().getTransaccion()); 
         EventBus.getDefault().post(evento); 
        } 
       } 

       @Override 
       public void onFailure(Call<Encuestado> call, Throwable t) { 

       } 
      }); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Boolean aBoolean) { 
      super.onPostExecute(aBoolean); 
     } 
    } 

    private class AgroquimicoSynchroTask extends AsyncTask<Agroquimicos, Void,Boolean>{ 

     @Override 
     protected Boolean doInBackground(Agroquimicos... agroquimicos) { 

      Call<Agroquimicos> agroquimicosCall = webDatumApi.sincroAgroquimico(
        "Token " + token, 
        agroquimicos[0] 
      ); 

      agroquimicosCall.enqueue(new Callback<Agroquimicos>() { 
       @Override 
       public void onResponse(Call<Agroquimicos> call, Response<Agroquimicos> response) { 
        if (response.isSuccessful()) { 
         MensajesDeEvento evento = new MensajesDeEvento(); 
         evento.setEvento("Success"); 
         evento.setDispatcher("AgroquimicoTask"); 
         evento.setTransaccion(response.body().getTransaccion()); 
         EventBus.getDefault().post(evento); 
        } 
       } 

       @Override 
       public void onFailure(Call<Agroquimicos> call, Throwable t) { 

       } 
      }); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Boolean aBoolean) { 
      super.onPostExecute(aBoolean); 
     } 
    } 

    private class FamiliaSynchroTask extends AsyncTask<Familia,Void,Boolean>{ 

     @Override 
     protected Boolean doInBackground(Familia... familias) { 

      Call<Familia> familiaCall = webDatumApi.sincroFamilia(
        "Token " + token, 
        familias[0] 
      ); 

      familiaCall.enqueue(new Callback<Familia>() { 
       @Override 
       public void onResponse(Call<Familia> call, Response<Familia> response) { 
        if (response.isSuccessful()) { 
         MensajesDeEvento evento = new MensajesDeEvento(); 
         evento.setEvento("Success"); 
         evento.setDispatcher("FamiliaTask"); 
         evento.setTransaccion(response.body().getTransaccion()); 
         EventBus.getDefault().post(evento); 
        } 
       } 

       @Override 
       public void onFailure(Call<Familia> call, Throwable t) { 

       } 
      }); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Boolean aBoolean) { 
      super.onPostExecute(aBoolean); 
     } 
    } 

    private class EncuestaSynchroTask extends AsyncTask<Encuesta,Void,Boolean>{ 

     @Override 
     protected Boolean doInBackground(Encuesta... encuestas) { 

      Call<Encuesta> encuestaCall = webDatumApi.sincroEncuesta(
        "Token " + token, 
        encuestas[0] 
      ); 

      encuestaCall.enqueue(new Callback<Encuesta>() { 
       @Override 
       public void onResponse(Call<Encuesta> call, Response<Encuesta> response) { 
        if (response.isSuccessful()) { 
         Log.d("SUCCESS","SUCCESS ENCUESTA"); 
        } 
       } 

       @Override 
       public void onFailure(Call<Encuesta> call, Throwable t) { 

       } 
      }); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Boolean aBoolean) { 
      super.onPostExecute(aBoolean); 
     } 
    } 



    private class ObtenerIdsTask extends AsyncTask<String,Void,Boolean>{ 

     @Override 
     protected Boolean doInBackground(String... strings) { 

      final String transaccion = strings[0]; 
      Call<IdsSincro> idsCall = webDatumApi.getIdsByTransaccion("Token "+token,strings[0]); 
      idsCall.enqueue(new Callback<IdsSincro>() { 
       @Override 
       public void onResponse(Call<IdsSincro> call, Response<IdsSincro> response) { 
        if(response.isSuccessful()){ 
         Encuesta encuesta = new Encuesta(); 
         encuesta.setEstablecimientoId(response.body().getEstablecimiento()); 
         encuesta.setEncuestadoId(response.body().getEncuestado()); 
         encuesta.setFamiliaId(response.body().getFamilia()); 
         encuesta.setAgroquimicoId(response.body().getAgroquimico()); 
         encuesta.setFecha(getEncuestaByTransaccion(transaccion).getFecha()); 
         encuesta.setUsuario(getEncuestaByTransaccion(transaccion).getUsuario()); 
         encuesta.setTransaccion(transaccion); 
         MensajesDeEvento evento = new MensajesDeEvento(); 
         evento.setEvento("Success"); 
         evento.setDispatcher("GetIdsTask"); 
         evento.setTransaccion(transaccion); 
         evento.setObject(encuesta); 
         EventBus.getDefault().post(evento); 
        } 
       } 

       @Override 
       public void onFailure(Call<IdsSincro> call, Throwable t) { 

       } 
      }); 


      return null; 
     } 

     @Override 
     protected void onPostExecute(Boolean aBoolean) { 
      super.onPostExecute(aBoolean); 
     } 
    } 

    private Encuesta getEncuestaByTransaccion(String transaction){ 
     TransaccionDao transaccionDao = daoSession.getTransaccionDao(); 
     Transaccion transaccion = transaccionDao.queryBuilder().where(TransaccionDao.Properties.Transaccion.eq(transaction)).list().get(0); 
     return transaccion.getEncuesta(); 
    } 

} 
+1

に解除されますonCreateViewでイベントバスにsubscribing、あるあなたのフラグメントにいくつかの方法を切り替えていますか? onCreateViewでイベントバスを購読しています。複数回コールされた場合は、onCreateで購読するか、onDestroyViewで購読を停止します。 – elmorabea

+0

そうです、購読をキャンセルするのを忘れました。ありがとうございました! – jaime

+0

今後のお手伝いをするための回答として投稿 – elmorabea

答えて

1

あなたは何とか自分のフラグメントを切り替えていますか?あなたはそれが複数回呼び出された場合、あなたはどちらか、複数のコールバックを取得onCreateに加入し、またはonDestroyView

関連する問題