2017-04-18 25 views
1

我是Android新手,在實現它時遇到了問題。 如果用戶已經登錄,並且如果用戶尚未登錄,那麼它將導航到LoginActivity.java,並試圖將用戶導航到MainActivity.java活動。在onCreate()啓動intent時出現無限循環

這是我的MainActivity.java的onCreate()方法內部的代碼。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    name = (TextView) findViewById(R.id.tvName); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 

    Gson gson = new GsonBuilder().create(); 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .build(); 

    sponsorApi = retrofit.create(SponsorInterface.class); 

    if (prefs.getBoolean(Constants.IS_LOGGED_IN, false)){ 
     Intent intent = new Intent(MainActivity.this, MainActivity.class); 
     startActivity(intent); 
     user = prefs.getString(Constants.USER, "Username"); 
     Call<Sponsor> sponsorRequest = sponsorApi.getSponsor(user); 
     sponsorRequest.enqueue(new Callback<Sponsor>() { 
      @Override 
      public void onResponse(Call<Sponsor> call, Response<Sponsor> response) { 
       int statusCode = response.code(); 
       final Sponsor sponsor = response.body(); 
       name.setText(sponsor.getName()); 
       Log.d("SponsorDetails Activity", "onResponse: " + statusCode); 
      } 

      @Override 
      public void onFailure(Call<Sponsor> call, Throwable t) { 
       Log.d("LoginActivity", "onFailure: " + t.getLocalizedMessage()); 
      } 
     }); 

    }else { 
     Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
     Toast.makeText(getBaseContext(), "Please login to proceed", Toast.LENGTH_SHORT).show(); 
     startActivity(intent); 
    } 
} 

當我運行的應用程序,它的工作原理,但在活動運行到無限循環,我不知道是什麼原因造成的循環。

UPDATE1:調試程序 enter image description here PS:SponsorDetails.java在圖像是問題的MainActivity.java。

UPDATE2:MainActivity 正如意見提出的刪除意向我刪除

Intent intent = new Intent(MainActivity.this, MainActivity.class); 
startActivity(intent); 

不過還是我得到的onResponse無限循環()方法。是的,刪除代碼後,我從模擬器中卸載了應用程序,然後從IDE重新運行應用程序。

更新3:在onStart()方法

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

    if (prefs.getBoolean(Constants.IS_LOGGED_IN, false)){ 
     Intent intent = new Intent(MainActivity.this, MainActivity.class); 
     startActivity(intent); 
    }else{ 
     Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
     Toast.makeText(getBaseContext(), "Please login to proceed", Toast.LENGTH_SHORT).show(); 
     startActivity(intent); 
    } 
} 
+0

您是否嘗試過使用調試器? – Jens

+3

'Intent intent = new Intent(MainActivity.this,MainActivity.class)' - 你爲什麼要開始你已經在的'Activity'? –

+0

爲什麼:'Intent intent = new Intent(MainActivity.this,MainActivity.class);' –

回答

1

替換您onStart()這個

@Override 
protected void onStart() { 
    super.onStart(); 
    if (!prefs.getBoolean(Constants.IS_LOGGED_IN, false)){ 
     Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
     Toast.makeText(getBaseContext(), "Please login to proceed", Toast.LENGTH_SHORT).show(); 
     startActivity(intent); 
    } 
} 

讓我知道如果這能幫助?

+0

它工作。謝謝。 –

1

基本上,你的主要活動開始不斷本身,這些都是兩行代碼導致它。只要刪除它們。

Intent intent = new Intent(MainActivity.this, MainActivity.class); 
    startActivity(intent); 
0

我想你沒有更新的登錄狀態偏好

更新像下面

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    name = (TextView) findViewById(R.id.tvName); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 

    Gson gson = new GsonBuilder().create(); 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .build(); 

    sponsorApi = retrofit.create(SponsorInterface.class); 

    if (prefs.getBoolean(Constants.IS_LOGGED_IN, false)){ 
     Intent intent = new Intent(MainActivity.this, MainActivity.class); 
     startActivity(intent); 
     user = prefs.getString(Constants.USER, "Username"); 
     Call<Sponsor> sponsorRequest = sponsorApi.getSponsor(user); 
     sponsorRequest.enqueue(new Callback<Sponsor>() { 
      @Override 
      public void onResponse(Call<Sponsor> call, Response<Sponsor> response) { 
       int statusCode = response.code(); 
       final Sponsor sponsor = response.body(); 
       name.setText(sponsor.getName()); 
       Log.d("SponsorDetails Activity", "onResponse: " + statusCode); 

       // update the IS_LOGGED_IN status as true 
       SharedPreferences.Editor editor = pref.edit(); 
       editor.putString(Constants.IS_LOGGED_IN ,true); 
       editor.commit(); 

      } 

      @Override 
      public void onFailure(Call<Sponsor> call, Throwable t) { 
       Log.d("LoginActivity", "onFailure: " + t.getLocalizedMessage()); 
      } 
     }); 

    }else { 
     Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
     Toast.makeText(getBaseContext(), "Please login to proceed", Toast.LENGTH_SHORT).show(); 
     startActivity(intent); 
    } 
} 

請試用狀態。這將解決您的問題

2

您所呼叫的MainActivity遞歸在if條件,
所以當條件爲真MainActivity被一次又一次地叫。

刪除兩行

Intent intent = new Intent(MainActivity.this, MainActivity.class); 
startActivity(intent); 

或者如果條件改變你想去的活動名稱。

+0

我有刪除線,但我仍然無限循環中的任何其他功能。謝謝您的回覆。而現在仿真器也沒有響應。 –

+0

首先重新啓動模擬器,然後嘗試從IDE重新運行您的應用程序。 –

+0

是的,我重新啓動模擬器,卸載應用程序,然後再次從IDE運行應用程序,但問題仍然存在。 –

相關問題