[英]Android: Starting an intent inside of onCreate is causing an infinite loop / crash
[英]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.