2016-01-29 18 views
15

Her 5 saniyede bir çalıştırmak gibi bir güçlendirme ağ çağrısı var. Benim geçerli kod:Retrofit "IllegalStateException: Zaten uygulandı"

Handler h = new Handler(); 
int delay = 5000; //milliseconds 

h.postDelayed(new Runnable() { 
    public void run() { 
     call.enqueue(new Callback<ApiResponse>() { 
      @Override 
      public void onResponse(Response<ApiResponse> response) { 
       Log.d("api", "response: " + response.body().getPosition().getLatitude().toString()); 
      } 

      @Override 
      public void onFailure(Throwable t) { 

      } 
     }); 
     h.postDelayed(this, delay); 
    } 
}, delay); 

Bu kez çalışır, ancak sonra aşağıdaki atar:

java.lang.IllegalStateException: Zaten idam. orbyt.project.MyFragment $ 1.run de retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall.enqueue de retrofit2.OkHttpCall.enqueue (OkHttpCall.java:52) (ExecutorCallAdapterFactory.java:57) de (MyFragment.java:93)

Sorun nedir?

Bir bonus olarak: Bunu işlemenin daha iyi bir yolu nedir? Her güncellemede bir harita güncelleniyor. Rx kullanmaya çalışmayı düşünüyordum, ancak bunun uygun bir kullanım durumu ya da nasıl uygulanacağından emin değilim.

+0

ağ görüşmelerinizin 5 saniyeden uzun sürmesi olasıdır, bu nedenle ikinci yineleme başladığında ilk yineleme henüz tamamlanmadı mı? İlk yineleme sona erdiğinde gecikme başlamaz, ancak ilk yineleme – TooManyEduardos

+0

@TooManyEduardos olarak adlandırdığınız zamandan 5 saniye sonra ilk görüşmenin tamamlandığını biliyorum çünkü yanıtı günlüğe kaydediyorum ve veri alıyorum. – Orbit

+0

ancak günlüğe kaydetme, ağ bağlantısı bitmiş değil, yalnızca alınan verileri gösterir. 5 saniyelik pencerede hala elemanlar kapanıyor olabilir. Bu sadece bir fikir, ancak gecikme süresini 15 saniye kadar artırmayı deneyin ve sorunun giderilip giderilmediğine bakın. – TooManyEduardos

cevap

45

Call A yalnızca bir kez kullanılabilir. Its documentation bir çok kez nasıl kullanılacağını anlatır:

Kullanım clone() aynı sunucunuza aynı parametrelerle birden arama yapmak için; Bu, yoklamayı uygulamak veya başarısız bir aramayı yeniden denemek için kullanılabilir.

Yani her istek için taze, uygulanmayan yargı Call sahip olmasını sağlamak için call.clone().enqueue(..) kullanın.

+0

Harika, teşekkürler. – Orbit

İlgili konular