2016-04-14 55 views
3

我需要一些幫助,解決一個問題,我真的不忍心。Nexus 6上的應用程序運行速度非常慢Android棉花糖跳過「n」幀

我正在使用真實設備調試我的應用程序。我有兩個,第一個是真正的摩托羅拉低資源(Android 5.0.2),這有助於我發現更多的錯誤;在這個應用程序stra 012 完美作品。第二個設備是的Nexus 6(安卓6.0.1)在應用程序的工作原理非常糟糕,它會很慢(甚至withouth的做任何事情,例如打開一個菜單),它讓我看到這樣的消息:跳過33幀!應用程序可能在其主線程上做了太多工作。

當我必須使用asynk任務時,我使用主線程來處理更少的事情。正如我之前所說,即使我只打開一個菜單(這意味着我不下載或做奇怪的事情),它顯示「skkiped frames」消息。該應用程序從不崩潰,但速度非常緩慢。

我已經在我的SDK管理器上安裝了所有東西。

我將向您解釋一個示例,其中我的應用程序運行緩慢並向您顯示代碼。在我的主要活動中,我有一個帶有NavigationView的工具欄,所以當我點擊「菜單按鈕」打開它時,需要3秒鐘才能打開它。

MainActivity代碼:

public class MainActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener, View.OnClickListener { 

private Toolbar toolbar; 
//private FloatingActionButton fab; 
private DrawerLayout drawer; 
private ActionBarDrawerToggle toggle; 
private NavigationView navigationView; 
private FragmentManager fragmentManager; 
private FragmentTransaction fragmentTransaction; 
private static final String TAG = "MainActivity"; 

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

    initMaterialDesign(); 

    if (savedInstanceState == null){ 
     showFragment(Constants.FRAGMENT_MENU); 
     navigationView.getMenu().getItem(0).setChecked(true); 
     getSupportActionBar().setTitle("Menú"); 
    } else{ 

    } 


} 

private void initMaterialDesign(){ 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    /*fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(this);*/ 

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

    toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 

    drawer.addDrawerListener(toggle); 

    toggle.syncState(); 

    navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 
} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

//@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    if (id == R.id.nav_menu) { 
     getSupportActionBar().setTitle("Menú"); 
     showFragment(Constants.FRAGMENT_VALORES); 
    } /*else if (id == R.id.nav_gallery) { 
     item.setChecked(true); 
    } */else if (id == R.id.nav_contactanos) { 
     contactanos(); 
    } /*else if (id == R.id.nav_manage) { 
     item.setChecked(true); 
    }*/else if (id == R.id.nav_logut) { 
     logOut(); 
    } 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     /* case R.id.fab: 
      Snackbar.make(v, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
      break;*/ 

    } 
} 

private void showFragment(int fragment){ 
    fragmentManager = getSupportFragmentManager(); 
    fragmentTransaction = fragmentManager.beginTransaction(); 
    switch (fragment){ 
     /*case Constants.FRAGMENT_VALORES: 
      ValoresFragment valoresFragment = new ValoresFragment(); 
      fragmentTransaction.replace(R.id.main_act_contenedorFragments, valoresFragment); 
      break; 
     case Constants.FRAGMENT_NOTICIAS: 
      break; 
     case Constants.FRAGMENT_WATCHLIST: 
      break; 
     case Constants.FRAGMENT_PORTFOLIO: 
      break;*/ 
     case Constants.FRAGMENT_MENU: 
      MenuFragment menuFragment = new MenuFragment(); 
      fragmentTransaction.replace(R.id.main_act_contenedorFragments, menuFragment); 
      break; 
    } 
    fragmentTransaction.commit(); 
} 

private void logOut(){ 
    new SweetAlertDialog(this, SweetAlertDialog.WARNING_TYPE) 
      .setTitleText(getString(R.string.nav_logout)) 
      .setContentText(getString(R.string.seguro_logout)) 
      .showCancelButton(true) 
      .setConfirmText(getString(R.string.aceptar)) 
      .setCancelText(getString(R.string.cancelar)) 
      .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() { 
       @Override 
       public void onClick(SweetAlertDialog sDialog) { 
        sDialog.dismiss(); 
       } 
      }) 
      .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() { 
       @Override 
       public void onClick(SweetAlertDialog sDialog) { 
        sDialog.dismissWithAnimation(); 
        borrarSPUser(); 
        irLoginAct(); 
        MainActivity.this.finish(); 

       } 
      }) 
      .show(); 
} 

private void borrarSPUser(){ 
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putString("usuario", ""); 
    editor.putString("pass", ""); 
    editor.commit(); 
} 

private void irLoginAct(){ 
    Intent intentRegistroActivity = new Intent(MainActivity.this, LoginActivity.class); 
    startActivity(intentRegistroActivity); 
} 

private void contactanos(){ 

    final Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My App"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Cuéntanos lo que quieras sobre la bolsa"); 

    startActivity(Intent.createChooser(emailIntent, "Elegir cliente:")); 
} 
} 

我知道這個代碼將不會幫助你得到一個答案,但我只是想告訴你,我沒有做什麼奇怪的。

這是logcat的:

04-14 12:34:28.596 8419-8419/? I/art: Late-enabling -Xcheck:jni 
    04-14 12:34:28.646 8419-8419/? W/System: ClassLoader referenced unknown path: /data/app/com.myapp-1/lib/arm 
    04-14 12:34:28.677 8419-8419/? V/Aplicacion: initParse: Parse iniciado 
    04-14 12:34:28.725 8419-8425/? I/art: Debugger is no longer active 
    04-14 12:34:28.764 8419-8445/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
    04-14 12:34:28.815 8419-8445/? I/Adreno: QUALCOMM build     : 52af4d2, I8366cd0437 
              Build Date      : 10/20/15 
              OpenGL ES Shader Compiler Version: XE031.05.13.02 
              Local Branch      : M14 
              Remote Branch     : 
              Remote Branch     : 
              Reconstruct Branch    : 
    04-14 12:34:28.819 8419-8445/? I/OpenGLRenderer: Initialized EGL, version 1.4 
    04-14 12:34:31.008 8419-8419/com.myapp V/LoadingActivity: DescargarAcciones >> Lista Acciones guardada en Application class 
    04-14 12:34:32.369 8419-8419/com.myapp V/LoadingActivity: getLastUpdate >> UPDATE 
    04-14 12:34:33.216 8419-8425/com.myapp W/art: Suspending all threads took: 28.414ms 
    04-14 12:34:33.663 8419-8419/com.myapp V/LoadingActivity: descargarHistorial >> historialIbex35 descargado y guardado 
    04-14 12:34:33.664 8419-8419/com.myapp V/LoadingActivity: modificarUltimoUpdate - Void done >> update realizado 
    04-14 12:34:34.000 8419-8419/com.myapp V/LoadingActivity: descargarRanking >> EXITO 
    04-14 12:34:34.000 8419-8419/com.myapp V/LoadingActivity: parsearRanking >> listaRanking guardada correctamente 
    04-14 12:34:34.211 8419-8425/com.myapp W/art: Suspending all threads took: 22.491ms 
    04-14 12:34:34.915 8419-8419/com.myapp I/Choreographer: Skipped 32 frames! The application may be doing too much work on its main thread. 
    04-14 12:48:33.438 8419-8419/com.myapp I/Choreographer: Skipped 35 frames! The application may be doing too much work on its main thread. 
    04-14 12:48:42.979 8419-8419/com.myapp I/Choreographer: Skipped 32 frames! The application may be doing too much work on its main thread. 
    04-14 12:48:43.537 8419-8419/com.myapp I/Choreographer: Skipped 33 frames! The application may be doing too much work on its main thread. 

我真的不已瞭解了是怎麼回事。我想記住,這是完美的工作在一個低資源設備,它的速度真的很慢。我已經在互聯網上了,但我還沒有找到任何東西。如果有人可以給我一個提示,那將會非常感激。提前感謝。

+0

這些是我的日誌消息。直到在LoadActivity中完成一切後,MainActivity纔會顯示出來。我使用Parse.com和AsyncTask。我沒有在主線程上做網絡IO。我應該將我的LoadingActivity添加到帖子中嗎?....(這是一個被刪除問題的答案) – QuinDa

回答

3

經過這麼長時間尋找一個回答我的問題,我沒有找到任何解決這個問題,但我得到了一些暗示,對我幫助很大,以獲得答案。

我發現了一些答案,這表明,問題可能由資源(可繪)引起的,但我相信我的繪圖資源進行了適當調整,爲每個畫面密度我的應用程序是爲製作。

問題是,我錯誤地認爲的Nexus 6(和每個設備其不是片劑)屏幕密度從LDPI到xxhdpi contemplanted。在這種情況下,的Nexus 6屏幕像素密度是DisplayMetrics.DENSITY_560,這樣我們就可以找到here它是該DENSITY_XXHIGH(480 DPI)和DENSITY_XXXHIGH(640 DPI)之間的某處坐在屏幕提供

中間密度。
所以文檔中說:
這不是應用程序應該定位的密度,而是依靠系統來爲它們縮放它們的DENSITY_XXXHIGH資產。

總之,這個問題是由於backgorund試圖縮放Nexus 6的屏幕密度引起的,所以應用程序進入了一個無限循環。

最後我創造了xxxhdpi-drawable文件夾和問題得到解決。

這對我來說很難檢測到,因爲我對整個應用程序有相同的背景,所以自從我啓動應用程序後,它在每個活動中都出錯了,沒有沒有背景或不同背景的活動這可能是正確的。

我希望這可以幫助有同樣問題的人。