私はアンドロイド開発に慣れていませんが、コード例を読み込もうとしているうちに、その中から呼び出されているメソッドが発生しました。論理的には、それ自体を呼び出す無限ループを作成する必要があります。しかし、それはしません。どうして?私MainActivity.java
なぜこのJava再帰メソッドは無限ループを作成していないのですか?
public void onWishlistSelected() {
launchUserSpecificFragment(new WishlistFragment(), WishlistFragment.class.getSimpleName(), new LoginDialogInterface() {
@Override
public void successfulLoginOrRegistration(User user) {
// If login was successful launch WishlistFragment.
onWishlistSelected(); // Why doesn't this create infine loop?
}
});
}
で
と、それを呼び出す:
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_wish_list) {
onWishlistSelected();
return true;
} else if (id == R.id.action_cart) {
onCartSelected();
return true;
}
return super.onOptionsItemSelected(item);
}
EDIT
ここではlaunchUserSpecificFragment
private void launchUserSpecificFragment(Fragment fragment, String transactionTag, LoginDialogInterface loginListener) {
if (SettingsMy.getActiveUser() != null) {
replaceFragment(fragment, transactionTag);
} else {
DialogFragment loginDialogFragment = LoginDialogFragment.newInstance(loginListener);
loginDialogFragment.show(getSupportFragmentManager(), LoginDialogFragment.class.getSimpleName());
}
}
0123内のコードです
とreplaceFragment
private void replaceFragment(Fragment newFragment, String transactionTag) {
if (newFragment != null) {
FragmentManager frgManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = frgManager.beginTransaction();
fragmentTransaction.setAllowOptimization(false);
fragmentTransaction.addToBackStack(transactionTag);
fragmentTransaction.replace(R.id.main_content_frame, newFragment).commit();
frgManager.executePendingTransactions();
} else {
Timber.e(new RuntimeException(), "Replace fragments with null newFragment parameter.");
}
}
だから、 'successfulLoginOrRegistration'の中で呼び出されたとき、なぜ' launchUserSpecificFragment'をもう一度呼び出さないのですか? –
@RameshPareek 'launchUserSpecificFragment'のコードを見て、それが何をしているのか見る必要があります。それ以外の場合は、それが何を呼び出すのか、それとも呼び出さないのかを伝える方法はありません。 – Eran
@RameshPareekです。しかし、 'successfulLoginOrRegistration'は、少なくとも直ちには再び呼び出されません。 – Sweeper