什么是导致主线程上的工作太多"警告?

时间:2016-05-04 14:30:49

标签: java android android-fragments

我知道有类似的标题问题,但我的情况略有不同......

我有一个包含一个Activity和一些Fragments的应用程序。当应用程序启动时,它会检查用户是否已登录。如果是,则启动主页片段。出于此问题的目的,我只是弹出一个Toast消息,其中显示登录而不是任何片段推出。该活动还包含一个DrawerLayout,它适当的覆盖方法,以及来自其他片段的一些接口方法,用于告诉主要活动该做什么。

我没有检索任何繁重的数据或建立任何网址连接,但由于某种原因,我一直在主线程上得到一个"跳过的框架/太多工作"警告。

当我需要检索JSON文件,连接到数据库等时,我主要熟悉使用ASyncTask。在这种情况下,我不确定如何解决我的问题。主要活动中有很多代码。我只是不确定什么才能最合理地放在一个单独的线程中,我应该怎么做?任何建议将不胜感激。

这是我的主要活动:

public class HomePage extends AppCompatActivity implements HomeFragment.OnClickedListener, CalendarFragment.OnClickedCalListener {
private FragmentTransaction ft;
private Fragment fragment;
private DrawerLayout drawerLayout;
private ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
String[] drawerListItems;
private static final String PREFS_LOGGED_IN = "AreYouLoggedInFile";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_page);

    String appVersion = "v1";
    Backendless.initApp(this, "blah blah", "blah", appVersion);

    if (findViewById(R.id.fragment_container) != null) {
        if (savedInstanceState != null) {

        }else{
            Toast.makeText(getApplicationContext, "Logged In", Toast.LENGTH).show();
        }
    }

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolBarHome);
    drawerLayout = (DrawerLayout)findViewById(R.id.homePageDrawer);
    drawerList = (ListView)findViewById(R.id.homePageList);
    drawerListItems = getResources().getStringArray(R.array.activities);
    drawerList.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,drawerListItems));
    drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            switch (position) {
                case 0: {
                    fragment = new CalendarFragment();
                    break;
                }
                case 1: {
                    fragment = new ContactsFragments();
                    break;
                }
                case 2: {
                    fragment = new HomeFragment();
                    break;
                }
                case 3:{
                    fragment = new ActivityFragment();
                    break;
                }
                case 4:{
                    Toast.makeText(getApplicationContext(), "Logged Out!", Toast.LENGTH_LONG).show();
                    Intent i = new Intent(HomePage.this, MainLoginActivity.class);
                    SharedPreferences myPrefs = getSharedPreferences(PREFS_LOGGED_IN, 0);
                    SharedPreferences.Editor editor = myPrefs.edit();
                    editor.putBoolean("isLoggedIn", false);
                    editor.commit();
                    startActivity(i);
                    finish();
                    break;
                }
            }
            ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_container,fragment);
            ft.addToBackStack(null);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
            drawerLayout.closeDrawer(drawerList);
        }
    });
    drawerToggle = new ActionBarDrawerToggle(this,drawerLayout,myToolbar,R.string.drawer_open,R.string.drawer_close)
    {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            invalidateOptionsMenu();
            syncState();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            invalidateOptionsMenu();
            syncState();
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);
    setSupportActionBar(myToolbar);
    myToolbar.setLogo(R.drawable.happy_dog_icon);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    drawerToggle.syncState();
}


@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    drawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    drawerToggle.onConfigurationChanged(newConfig);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:{
            if (drawerLayout.isDrawerOpen(drawerList)){
                drawerLayout.closeDrawer(drawerList);
            }else{
                drawerLayout.openDrawer(drawerList);
            }
            return true;
        }case R.id.infoActionBar:{
            Toast.makeText(getApplicationContext(), "Hey", Toast.LENGTH_LONG).show();
        }
        default:return super.onOptionsItemSelected(item);
    }
}

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

@Override
public void buttonClicked(View v) {
    switch (v.getId()){
        case R.id.logoutButton:{
            Backendless.UserService.logout(new AsyncCallback<Void>() {
                public void handleResponse(Void response) {
                    Toast.makeText(getApplicationContext(), "Logged Out!", Toast.LENGTH_LONG).show();
                    Intent i = new Intent(HomePage.this, MainLoginActivity.class);
                    SharedPreferences myPrefs = getSharedPreferences(PREFS_LOGGED_IN, 0);
                    SharedPreferences.Editor editor = myPrefs.edit();
                    editor.putBoolean("isLoggedIn", false);
                    editor.commit();
                    startActivity(i);
                    finish();
                }

                public void handleFault(BackendlessFault fault) {
                    Toast.makeText(getApplicationContext(), "Did Not Log Out!", Toast.LENGTH_LONG).show();
                }
            });
        }
        case R.id.calendarButton:{
            fragment = new CalendarFragment();
            break;
        }
        case R.id.activityButton:{
            fragment = new ActivityFragment();
            break;
        }
        case R.id.contactsButton:{
            fragment = new ContactsFragments();
            break;
        }
    }
    ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container,fragment);
    ft.addToBackStack(null);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ft.commit();
}

谢谢

2 个答案:

答案 0 :(得分:1)

好的,不看代码我建议您在代码上运行性能分析工具。这将显示你是CPU工作最困难的。大多数IDE都有这个功能,这里有一些流行的java / android IDE性能工具的链接(当然是内置的):

如果你使用不同的东西环顾四周寻找任何你使用的工具。

答案 1 :(得分:1)

我在您的代码中看到的最大问题是您每次更改网页时都会创建new fragment。你不应该这样做,你正在吃掉你的记忆,特别是如果所有这些片段有很多渲染要做的话。 理想情况下,您应该在需要时创建一次片段,并在返回其抽屉图标时重用该片段。

添加到您的应用程序中,您可能会遇到一些内存泄漏,可能来自上述问题。

您的申请表中有大量照片吗?您可能在应用程序中进行了大量的运行时缩放,导致Android到GC。