2017-04-18 11 views
1

私はAndroidが初めてで、実装中に問題が発生しました。 ユーザーが既にログインしている場合にMainActivity.javaアクティビティに移動しようとしています。ユーザーがログインしていない場合、LoginActivity.javaに移動します。onCreate()内でインテントインテントを開始するときに無限ループを取得する

これは、私の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); 
    } 
} 

私はアプリを実行すると機能しますが、アクティビティは無限ループに陥り、ループの原因はわかりません。

アップデート1:デバッガ enter image description here PS:画像内SponsorDetails.javaが問題のMainActivity.javaです。

アップデート2:私は

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

を削除しかし、まだ、私はonResponseで無限ループ()メソッドを取得していますコメントで示唆したようにMainActivity の意図を削除します。はい、コードを削除した後、私はエミュレータからアプリケーションをアンインストールし、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 =新しいインテント(MainActivity.this、MainActivity.class)' - なぜあなたは既にもう一度アクティビティを開始したいのですか? –

+0

なぜ: 'Intent intent = new Intent(MainActivity.this、MainActivity.class);' –

答えて

1

は、このことができますなら、私を知ってみましょう。この

@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); 
    } 
} 

であなたのonStart()を置き換えますか?

+0

それは働いた。ありがとうございました。 –

1

基本的に、あなたの主な活動は、それ自体を起動し続ける、これらは、それを引き起こして2行のコードです。ただそれらを削除します。

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); 
    } 
} 

以下のようなステータスが試してみるてください環境設定での状態でログインし

アップデートを更新していないと思います。これは、あなたがそう
条件が真MainActivityが何度も呼び出され、状態の場合では、再帰的にMainActivityを呼び出しているあなたの問題

2

を解決します。

二行

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

またはあなたがもし条件にに行きたいアクティビティ名を変更を削除します。

+0

私は行を削除しましたが、私はまだ無限ループを取得しています。ご返信ありがとうございます。そして今、エミュレータは応答していません。 –

+0

最初の再起動エミュレータを実行し、IDEからアプリケーションを再実行しようとします。 –

+0

はい、私はエミュレータを再起動し、アプリケーションをアンインストールして、IDEから再度アプリケーションを再実行しましたが、問題は引き続き存在します。 –

関連する問題