2016-05-04 48 views
0

我知道有类似的题目问题,但我的略有不同.....什么是导致“主线程工作太多”的警告?

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

我没有检索任何沉重的数据或进行任何URL连接,但出于某种原因,我总是收到“跳过的帧/主线程上的太多工作”警告。

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

这里是我的主要活动:

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

谢谢

+0

这是什么功能? 'Backendless.initApp(this,“blah blah”,“blah”,appVersion);' – ChampS

+0

使用模拟器时非常正常。 – natario

回答

1

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

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

您的应用程序中是否有大量照片?您可能会在应用程序中执行大量运行时间缩放,导致Android转为GC。

+1

嘿,我改变了我的代码,并且每次选择DrawerLayout中的菜单选项时都不会创建新的Fragment。但我仍然收到警告。我没有提到我在模拟器中这样做。当我连接我的设备时,没有问题。这对模拟器是否很常见,我应该多加重视修补它?谢谢。 –

+1

仿真器通常内存更紧密,更接近低端设备。 您的设备跳过了多少帧? 看看这个[post](http://stackoverflow.com/questions/14678593/the-application-may-be-doing-too-much-work-on-its-main-thread),如果你跳过大约100,但它的罚款在一个设备上,你应该没问题。 – VirtualProdigy

+1

我通常会尝试确保我的应用程序能够在模拟器以及一些设备上顺利运行。您希望能够适应您的所有用户以及他们拥有的任何恶意设备。也就是说,如果您想仔细检查您的应用,请尝试将您的应用放在手机上,并在开发人员选项中启用“不要保留活动”。这模拟了设备内存不足 – VirtualProdigy

1

OK,不看我建议你运行的代码性能分析工具的代码。这将表明你是CPU工作最困难的。如果您使用

:大多数IDE具备这个功能,这里有一些链接流行的Java/Android的IDE性能工具(内置的,当然)无论您使用什么样的东西,都可以使用不同的分析工具。

相关问题