簡體   English   中英

OnResume() 在 MainActivity 中導致無限循環

[英]OnResume() causing infinite loop in MainActivity

我最近在我的主要活動中添加了 OnResume 方法,但是,在這樣做之后,我的應用程序現在陷入無限循環,因為 OnResume 被重復調用,但我不知道為什么。

任何想法是什么我的 MainActivity 代碼導致 OnResume 方法被重復調用? 或者在 Android Studio 中是否有一種方法可以追溯以查看調用的來源?

作為參考,我想在 OnResume 方法中調用 recreate 的原因是用戶可以在另一個活動中更改活動主題,所以當我回到 MainActivity 時,我希望它選擇主題更改。

public class MainActivity extends AppCompatActivity {

    Toolbar toolbar;
    TabLayout tabLayout;
    static int errorDelay = 2000;
    ViewPager viewPager;
    PageAdapter pageAdapter;
    TabItem tabAveSpeed;
    TabItem tabDistance;
    TabItem tabTime;



    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int) event.getRawX(), (int) event.getRawY())) {
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent(event);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        if (!PrefUtil.getBool(this, "usedBefore")) {
            PrefUtil.saveInt(this, "distanceSpinnerPref", 0);
            PrefUtil.saveBool(this, "usedBefore", true);
            PrefUtil.saveString(this, "activeThemeColour", "Grey");
        }

        String colour = PrefUtil.getString(this, "activeThemeColour");

        switch (colour) {
            case "Green":
                setTheme(R.style.AppTheme_Green);
                break;
            case "Grey":
                setTheme(R.style.AppTheme_Grey);
                break;
            default:
                setTheme(R.style.AppTheme_Grey);
                break;
        }


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        toolbar = findViewById(R.id.toolbar);
        toolbar.setTitle(getResources().getString(R.string.app_name));
        setSupportActionBar(toolbar);

        tabLayout = findViewById(R.id.tabMenu);
        tabAveSpeed = findViewById(R.id.averageSpeedTab);
        tabDistance = findViewById(R.id.distanceTab);
        tabTime = findViewById(R.id.timeTab);
        viewPager = findViewById(R.id.viewPager);

        pageAdapter = new PageAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(pageAdapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));



        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }

    @Override
    protected void onResume(){
        super.onResume();
        recreate();
    }

    public void updateTabTitle (String newTitle){
        TabLayout tabLayout;
        tabLayout = findViewById(R.id.tabMenu);
        tabLayout.getTabAt(0).setText(newTitle);
    }
}

正如其他人所提到的,在您的onResume()方法中不加選擇地調用recreate()會給您帶來無限循環。

您可以執行一些操作,例如在用戶更改主題時將值寫入SharedPreferences ,然后在您的onResume()檢查該值,如果主題已更改,則僅調用recreate()

在您的其他活動中,當用戶更改主題時,請執行以下操作:

PreferencesManager.getDefaultSharedPreferences(context)
        .edit()
        .putBoolean("theme_changed", true)
        .apply();

然后在您的其他活動中,在onResume() ,執行以下操作:

SharedPreferences prefs = PreferencesManager.getDefaultSharedPreferences(this);

if (prefs.getBoolean("theme_changed", false)) {
    prefs.edit().remove("theme_changed").apply();
    recreate();
}

這樣,您只會在有理由這樣做時才recreate() ,並且不會永遠循環。

刪除recreate(); 從這一行:

@Override
protected void onResume(){
    super.onResume();
    //recreate();  - delete this line
}

您可以在文檔中閱讀recreate()作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM