2016-03-31 10 views
0

Android Studio'da varsayılan Oturum Açma özelliğini kullandım ve basit bir oturum açma görünümü oluşturdum. Uygulamamda kimlik doğrulama görevi ve erişim belirteci üretimi, API çağrıları aracılığıyla sunucu tarafından gerçekleştiriliyor. Ancak, api çağrısının bir tamamlama bloğu olması gerektiğinden, doInBackground oturum açma işlevim de çalışır. Bu nedenle, kimlik doğrulama sonucu, tamamlama bloğunun iş parçacığı içinde bulunur; bu, orijinal doInBackground öğesinin döndürülen sonucunu onPostExecute için yanlış yapar. Fonksiyonlar geçersiz, bu yüzden onların parametrelerini ve formatlarını değiştiremiyorum. Android geliştirmede hala yeni ve asenkronize edilmiş görevine hala aşina değilim, bu yüzden doInBackground'da durma ve sonuç blokunda sonucun beklenmesi için herhangi bir yol olup olmadığını sormak isterim? Ya da API girişimi çözmek için daha iyi bir çözüm var mı? Teşekkürler. İşteOturum açtıktan sonra doInBackground sonucunu döndürme API tamamlama bloğu, oturum açıldıktan sonra UserLoginTask

benim UserLoginTask kod (KOTLIN yazılmış ama konsept java ile aynı olacağını düşünüyorum):

inner class UserLoginTask internal constructor(private val mUsername: String, private val mPassword) : AsyncTask<Void, Void, Boolean>() { 
    override fun doInBackground(vararg params: Void?): Boolean? { 
     var result = false 
     try { 
      Thread.sleep(2000) 
     } catch(e: InterruptedException) { 
      return false 
     } 

     MyLoginService().login(mUsername, mPassword, onCompleted = { token -> 
      // I want to get the login result from here and return it to onPostExecute 
      // It's no use if I change the result to true here because the result is already returned before completion. 
     }) 

     return result 
    } 

    override fun onPostExecute(success: Boolean?) { 
     mAuthTask = null 
     showProgress(false) 
     if(success!!) { 
      finish() 
     } else { 
      mPasswordView!!.error = getString(R.string.error_incorrect_password) 
      mPasswordView!!.requestFocus() 
     } 

    } 

    override fun onCancelled() { 
     mAuthTask = null 
     showProgress(false) 
    } 
} 
+1

Eşzamansız görev geçersiz kılma işlevlerinin parametreleri ve dönüş tipi, AsyncTask () öğesinde tanımlanan parametreye bağlıdır. Yani, Boole parametresini onpostExecute yönteminde istediğiniz üçüncü parametreye değiştirin. –

+0

"Sonuç" ifadesiniExExpress'e döndürüyorsunuz .. Bu koddan "sonuç" her zaman yanlıştır. Bu değeri asla değiştirmiyor musunuz? –

+0

Geri dönüş türünü nasıl değiştireceğimi anlatmak için teşekkürler @AshimKansal, çok yardımcı olur! Şimdi, yalnızca tamamlama bloğu ile uğraşmaya odaklanmayı deneyebilirim ... – whitney13625

cevap

2

Sen bunu yapabilir ama bu iyi bir fikir değil. Sizin durumunuzda, bir AsyncTask değil, Rx veya futures gibi bir şey kullanmak daha iyidir.

override fun doInBackground(vararg params: Void?): Boolean? { 
    val exchanger = Exchanger<Boolean>() 
    MyLoginService().login(mUsername, mPassword, onCompleted = { token -> 
    exchanger.exchange(token != null) 
    }) 

    return try { 
    exchanger.exchange(false) 
    } catch (exception: InterruptedException) { 
    false 
    } 
} 
+0

Son olarak giriş hizmetimi ana iş parçacığına taşıdım ve sorunu çözdüm. Ancak bahsettiğiniz değiştirici, kullanışlı bir araç gibi görünüyor! Yeni bir şey öğrendim, teşekkürler! – whitney13625

İlgili konular