2016-03-23 20 views
0
olarak adlandırılıyor

Bir android uygulaması için temel bir giriş ekranı uygulamaya çalışıyorum. Akış şu şekildedir:
1) Kullanıcı oturum açma bilgilerini girer ve
bildirimlerini gönderir. 2) AsyncTask uzantısını oluşturan LoginRequest oluşturulur ve çalıştırılır.
3) doInBackground bazı http ateş edeceği kullanıcı kimlik
4) onPostExecuteloginResults
5) Ui iplik giriş sonuçlarını görür ve ona göre devam ayarlamak için denir elde edilmelidir doğrulamak için çağırır.AsyncTask onPostExecute,

Kök sorununa ulaşmak için kodu basitleştirdim ancak şu ana kadar hiç şansınız olmadı. Sorunu hala yeniden yorumlayan basitleştirilmiş kod. Etkinliğime İçinde

:

private void tryLogin(String email, String password) 
{ 
    this.showProgress(true); 
    LoginHelper loginHelper = new LoginHelper(); 
    LoginResult result = loginHelper.tryLogin(email, password); 
    this.showProgress(false); 
} 

Bu tıklama dinleyici benim teslim düğmelerinden çağrılır.

İçinde LoginHelper:

TestClass test = new TestClass(); 
public LoginResult tryLogin(String mobileNumber, String password, int deviceId) 
{ 
    String loginUrl = "..."; 
    new LoginRequest(test).execute(loginUrl); 

    while (test.result == null) 
    { 
     try { 
      Thread.sleep(1000); 
     } 
     catch (Exception e) 
     { 
      //... 
     } 
    } 
    return test.result; 
} 

Bu AsyncTask yürütmek ve sürekli olmak sonucu bekler.

LoginRequest:

public class LoginRequest extends AsyncTask<String, Void, LoginResult> 
    TestClass test; 

    public LoginRequest(TestClass test) 
    { 
     this.test = test; 
    } 
    @Override 
    protected LoginResult doInBackground(String... params) { 

     LoginResult ret = null; 
     ret = new LoginResult(1,"test"); 
     return ret; 
    } 

    @Override 
    protected void onPostExecute(LoginResult result) { 
     this.test.result = result; 
    } 
} 

Ben doInBackground ve onPostExecute içindeki kesme noktaları ile debugger ile bu çalıştırın. doInBackground düzgün olarak yürütür ve LoginResult değerini döndürür, ancak onPostExecute kesme noktası hiçbir zaman vurulmaz ve kodum LoginHelper içinde while döngüsünde bekler.

+0

onPostExecute() çağrılmıyorsa yürütülen sonraki deyimin hangisini bulmayı denediniz? –

+0

Bu bağlantıya bir göz atın, size yardımcı olabilir http://nads-rosun.blogspot.in/2014/01/android-login-application-using.html – AmeeJoshi

+0

@AlokGupta LoginHelper'ın içindeki döngü, sürekli olarak test için bekleyecektir. sonuç ayarlanması. –

cevap

0

Temel olarak, LoginRequest'inizin 'result' değişkenini tüm zamanını kontrol edersiniz. Ama öyle değil, AsyncTask nasıl çalışır? Docs itibaren

:

AsyncTask Eğer kullanıcı arabirimde asenkron işi gerçekleştirmesini sağlar.Bir iş parçacığı içinde engelleme işlemlerini gerçekleştirir ve sonra iş parçacığı ve/veya işleyicilerin kendiniz için gereksinim duymadan sonuçları UI iş parçacığında yayınlar.

Sen doInBackground() yönteminde işinizi yapabilir ve OnPostExecute() size sonuçları yayımlamak.

onPostExecute, öğeleri değiştirmenize, sonucu göstermenize veya ne yapmak isterseniz yapmaya izin vermek için UI Thread üzerinde çalışır. Sorununuz, tüm zamanlama iş parçacığının tryLogin()

'daki denetim yönteminizle engellendiğinden, nasıl çözülür? AsyncTask içinde

public void tryLogin(String mobileNumber, String password, int deviceId) 
{ 
    // Starts AsynTasks, handle results there 
    String loginUrl = "..."; 
    new LoginRequest().execute(loginUrl); 
} 

:

public class LoginRequest extends AsyncTask<String, Void, LoginResult> 

    // Removed Constructor, if you need to pass some other variables, add it again 

    @Override 
    protected LoginResult doInBackground(String... params) { 

     // TODO: Change this to actual Http Request 
     LoginResult ret = null; 
     ret = new LoginResult(1, "test"); 
     return ret; 
    } 

    @Override 
    protected void onPostExecute(LoginResult result) { 
     // Now the result arrived! 
     // TODO: Use the result 
    } 
} 

Daha Düşünceler:

  1. Muhtemelen kullanıcı kimlik bilgilerini saklamak istediğiniz

    kontrol yöntemini çıkarın. Eğer öyleyse, güvenli olduğundan emin olun. Link
  2. Sonuçlara bağlı olarak, bazı UI'leri değiştirmeniz gerekebilir. İşte bir örnek:

AsyncTask:

public class LoginRequest

private Activity activity; 

    // Constructor 
    public LoginRequest(Activity activity) { 
     this.activity = activity; 
    } 

    @Override 
    protected LoginResult doInBackground(String... params) { 

     // TODO: Change this to actual Http Request 
     LoginResult ret = null; 
     ret = new LoginResult(1, "test"); 
     return ret; 
    } 

    @Override 
    protected void onPostExecute(LoginResult result) { 

     ActivityLogin acLogin = (ActivityLogin) activity; 

     if(result.equals("ok")) { 
      Button loginButton = (Button) acLogin.findViewById(R.id.login-button); 
      loginButton.setBackgroundColor(Color.GREEN); 

      //Finish LoginActivity 
      acLogin.finish(); 
     } 
     else { 
      //TODO: Fail Handling 
     } 
    } 
} 

AsyncTask

uzanır Ve bu şekilde başlatın:

new LoginRequest(loginActivity).execute(loginUrl); 

Ben kodu test vermedi.

+0

teşekkürler! Ana mesele, Umshread denilen bir isim almak istemediğimi fark etmemekti. Bu, değerin belirlenmesini beklemiyordum ve bunun yerine LoginActivity'de bir geri çağırma kullanabiliyordum. –

+0

@ n8.premo Buna yardımcı oldu :) –

0

AsyncTask bu yüzden LoginRequest ve while (test.result) işlevini aynı anda çağırıyor. While döngüsünde takıldınız çünkü test.result henüz geri dönmedi. test.result onPostExecute() içinde yapılır, böylece bu işlevin içinde döngü sırasında hareket ederseniz çalışır ve onPostExecute() çağrılır. Bu sorunu çözmenin bir yolu, geri arama arabirimini uygulamaktır. While döngüsünü geçersiz kılınmış geri arama yöntemine koyun. burada cevaba bakınız: how to send ArrayList(Bitmap) from asyncTask to Fragment and use it in Arrayadapter

+0

async sınıfındaki verilere erişim için post icra metodumuzda. Belki yorumunuzu yanlış anladım, ancak while döngüsü sabit değil. Döngü, test.result değerinin boş olup olmadığını kontrol eder, çünkü null, iş parçacığı 1 saniye boyunca uyur ve tekrar dener. Eğer bir kırılma noktasını tutturabilirsem, uyuduğunu görebilirim, eğer döngü engelliyorsa AsyncTask bu noktada devam etmemeli mi? –

0

Bu

public class LoginRequest extends AsyncTask<String, Void, LoginResult> 
    { 
    TestClass test; 
     LoginResult ret = null; 

    public LoginRequest(TestClass test) 
    { 
     this.test = test; 
    } 
    @Override 
    protected Boolean doInBackground(String... params) { 
     ret = new LoginResult(1,"test"); 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean success) { 
     if(success) 
      this.test.result = result; 
    } 
    } 
+0

Denedim ve ne yazık ki aynı sonucu aldım, doInBackground yürütür, ancak onPostExecute asla çağrılmaz. –

+0

atılmış herhangi bir hata var mı, yoksa hata ayıklama işaretçisinin doInBackground() –

0

Geçici çözüm deneyin: Sen doInbackground() yöntemde this.test.result = result; ekleyebilir.

@Override 
protected LoginResult doInBackground(String... params) { 

      LoginResult ret = null; 
      ret = new LoginResult(1, "test"); 
      this.test.result = result; 
      return ret; 
} 

Lütfen doğru çözümü almak için kodu eksiksiz gönderin.

İlgili konular