68

benim app nasıl yerleştirildiğine bağlı olduğu:OnResume() onActivityResult() işlevinden önce mi çağrıldı? İşte

  1. onResume() kullanıcı giriş istenir
  2. Eğer kullanıcı günlükleri, kullanıcı herhangi dışarı oturum açıyorsa o uygulamayı 3. kullanmaya devam edebilirsiniz zaman, yeniden giriş istemek istiyorum

Bunu nasıl başarabilirim?) (

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show(); 
     } 
    } 

sorun, onResume geçerli: Kullanıcı başarıyla oturum açtıktan sonra

@Override 
     protected void onPostExecute(JSONObject json) { 
      String authorized = "200"; 
      String unauthorized = "401"; 
      String notfound = "404"; 
      String status = new String(); 

      try { 
       // Get the messages array 
       JSONObject response = json.getJSONObject("response"); 
       status = response.getString("status"); 

       if(status.equals(authorized)){ 
        Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show(); 
        prefs.edit().putBoolean("isLoggedIn",true); 

        setResult(RESULT_OK, getIntent()); 
        finish(); 
       } 
       else if (status.equals(unauthorized)){ 
        Toast.makeText(getApplicationContext(), "The username and password you provided are incorrect!",Toast.LENGTH_SHORT).show(); 
        prefs.edit().putBoolean("isLoggedIn",true); 
       } 
       else if(status.equals(notfound)){ 
        Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show(); 
        prefs.edit().putBoolean("isLoggedIn",true); 
       } 
      } catch (JSONException e) { 
       System.out.println(e); 
      } catch (NullPointerException e) { 
       System.out.println(e); 
      } 
     } 
    } 

: Burada

@Override 
    protected void onResume(){ 
     super.onResume(); 

     isLoggedIn = prefs.getBoolean("isLoggedIn", false); 

     if(!isLoggedIn){ 
      showLoginActivity(); 
     } 
    } 

benim LoginActivity: İşte

benim MainActivity olduğunu onActivityResult() öğesinden önce çağrılır, böylece kullanıcı başarıyla oturum açtığında ana etkinliğim not almaz çünkü onResume() önce çağrılır.

Giriş yapmak için en uygun yer neresi?

cevap

80

onActivityResult çağrısı, onResume'den önce gerçekleşir, aslında (bkz. the docs). Gerçekte istediğiniz aktiviteyi startActivityForResult ile başlattığınızdan ve etkinliğinize bir değer döndürmeden önce çağrılan etkinliğin sonucunu RESULT_OK olarak ayarladığınızdan emin misiniz? Log ifadesini onActivityResult numaranıza yazarak bu değeri kaydedip vurulduklarından emin olun. Ayrıca, nerede isLoggedIn tercihini ayarlıyorsunuz? Oturum açma etkinliğinizde bunu zaten dönmeden önce true olarak ayarlamalısınız gibi görünüyor, ancak bu kesinlikle gerçekleşmiyor.

+0

Kullanıcı giriş yaptıktan sonra 'ınLoggedIn ayarını yaptım. Güncellenmiş koduma bakın. Neyin yanlış olduğundan emin değil misiniz? –

+0

haklısınız, onActivityResult() onResume() öğesinden önce çağrılıyor. Prefs'imin neden yanlış okunabileceğinden emin değil misin? –

+6

, putBoolean'ımdan sonra bir commit() ekledi. Hile yaptı. –

2

Oturum açma durumunu etkinlikten soyutlamayı düşünebilirsiniz. Örneğin, bir kullanıcı yorum gönderebiliyorsa, etkinlik durumu yerine onPost eylem pingi için giriş durumuna izin verin ve oradan gidin.

21

Parçalarla onResume() numaralı çağrıdan önce çağrılan onActivityResult() kadar basit değildir. Geri döndüğünüz etkinlik geçici olarak elden çıkarılmışsa, onActivityResult() numaralı telefon numaralarından getActivity() numaralı çağrıların sıfırlanacağını görürsünüz. Ancak, etkinlik elden çıkarılmamışsa, getActivity() numaralı telefona çağrı, aktiviteyi iade edecektir.

Bu tutarsızlık, teşhis edilmesi zor bir kusur kaynağı olabilir, ancak "Etkinliği koruma" geliştirici seçeneğini etkinleştirerek uygulamanızın davranışını kontrol edebilirsiniz. Bu durumu açık tutmaya eğilimliydim - üretimde NullPointerException gelişimde görmeyi tercih ederim.