2016-03-22 23 views
2

Uygulanan bir simge yenileme sistemi olan bir API ile karşı karşıyayım. API istekleri için Retrofit kullanıyorum ve bir Error 401 verilip verilmediğini algılamak için bir Authenticator belirledim ve belirteci yenilemek için yeni istekte bulundu.Birden çok eşzamansız api çağrısı olan kimlik doğrulayıcısı

sorun, uygulama aynı anda birden çok istek varsa (örneğin kullanıcı uygulamasını kullanarak ve başka API isteği neden ise, bir ViewPager ya da bir Service bir API isteği birden çok sayfayı doldurmak için) olmasıdır Bu, birden çok kez hata veriyor ve bu nedenle, uygulama, Authenticator'ı birkaç kez istemektedir.

Bunu nasıl düzeltebilirsiniz? Uygulamanın bir belirteç yenileme çağrısı yapıp yapmadığını algılamak için bir boolean ile bir Singleton düşünüyorum ama bunu başarmanın en iyi yolu bana görünmüyor ... Herhangi bir recomendations? Ben Singleton söyleyebilirim

+0

Ian Gölü'nden bu makaleye bir göz atın https://medium.com/google-developers/making-loading-data-on-android-lifecycle-aware-897e12760832#.llikp8avi – marco

+0

Ben kontrol edeceğiz teşekkürler – antonicg

+0

OAuth kullanıyor musunuz? Erişim belirtecini ne sıklıkla yenilemeniz gerekiyor? Çok sık değilse, geçerli kullanıcı geçerli bir belirteç varsa, bir "test" bitiş noktasına erişmeye çalışarak uygulama başlangıcını kontrol edebilirsiniz. 200'ü içerik ekranları ve diğer isteklerle devam ettirirseniz, yeni erişim belirteci almaya çalışmayın, hala geçerli değilse yeni yenileme belirtisine ihtiyacınız var -> giriş ekranını göster. – rafakob

cevap

0

iyi bir fikir olduğunu, ancak Singleton tarafından bir kimlik api istemci nesnesinin içinde itiraz sahip demek - bu nesne kapsamı yerine bütün uygulama kapsamında tekil olur. Benim bir semafore olarak kullanılmak üzere yeni bir nesne getirecek this answer

benzer bir şey yapıyor tavsiye ederim - bu 'kimlik bilgileri tazelenmiş ediliyor' her zaman engellenecektir. Yalnızca bir 'yenileme kimlik bilgisi' araması yapacağınızdan emin olmak için, onu nesne ile senkronize edilen kod bloğunda çağırmanız gerekir.

+0

Evet, problemi aylar önce bu şekilde çözdüm, moreless. Senkronize edilmiş bir işleve sahip bir singleton kullanıyorum, isteğin belirtecinin kaydedilen belirteçle aynı olup olmadığını kontrol ediyorum. Aynı ise, jetonun henüz yenilenmediği anlamına gelir, bu yüzden yenilemeyi yürütürüm. Değilse, sonraki istekler, isteği yenilenmiş jetonla tekrar yürütür. – antonicg

+0

Harika çözdün - Bunu bilmiyordum. Yani aslında benim önerdiğim aynı yaklaşım, tek fark tekton yöntemini engellemeniz ve kod bloğunu bloke etmem, ki bu elbette metoda ayıklanabilir. –