繁体   English   中英

在onCreate()中启动意图时获取无限循环

[英]Getting Infinite Loop when starting intent inside onCreate()

我是Android新手,在实施它时遇到了问题。 我正在尝试将用户导航到MainActivity.java活动(如果用户已经登录),并且如果用户尚未登录,则它将导航至LoginActivity.java。

这是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:​​调试器 在此处输入图片说明 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); 
    }
}

您在if条件中递归调用MainActivity
因此,当条件为true时,MainActivity将一次又一次被调用。

删除两行

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

或更改您想进入的活动名称(如果有条件)。

基本上,您的主要活动一直在开始,而这是引起它的两行代码。 只需删除它们。

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

将此替换为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); 
    }
}

让我知道这是否有帮助?

我认为您没有更新首选项中的登录状态

如下更新状态

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

请尝试一下。 这将解决您的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM