2016-05-04 9 views
0

私は同じようなタイトルの質問があることを知っていますが、私のものは少し異なります.....「主スレッドで処理が多すぎます」という警告が表示される原因

私は1つのアクティビティと複数のフラグメントを含むアプリケーションを持っています。アプリケーションが起動されると、ユーザーがログインしているかどうかを確認します。そうであれば、ホームページのフラグメントが起動されます。この質問の目的のために、フラグメントの代わりにログインしたというToastメッセージのポップアップがあります開始されました。アクティビティには、DrawerLayout、適切なオーバーライドメソッド、およびメインアクティビティに何をすべきかを伝える他のフラグメントからのインターフェイスメソッドも含まれています。

重いデータを取得していないか、URLの接続を行っていませんが、何らかの理由で「メインフレームでフレームがスキップされました」という警告が表示され続けます。

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

は、私はあなたがコードのパフォーマンス分析ツールを実行することをお勧めしますコードを見ずに、

+0

この機能は何ですか? 'Backendless.initApp(これは、" blah blah "、" blah "、appVersion); ' – ChampS

+0

エミュレータを使用すると、かなり正常です。 – natario

答えて

1

あなたのコードで見られる最大の問題は、ページを変更するたびにnew fragmentを作成することです。あなたはこれをやってはいけません。あなたの記憶を食べています。特に、それらの断片には、たくさんのレンダリングがある場合です。 理想的には、必要に応じて一度フラグメントを作成し、そのフラグメントのアイコンに戻るときにそのフラグメントを再利用する必要があります。

LeakCanaryをアプリケーションに追加すると、前述の問題の可能性があるメモリリークが発生する可能性があります。

アプリケーションに大量の写真がありますか?あなたはおそらくアプリケーションでランタイムスケーリングを大量にやっているので、AndroidをGCにすることになります。

+1

Hey、私は自分のコードを変更し、DrawerLayoutのメニューオプションが選択されるたびに新しいFragmentを作成しません。私はまだ警告を得ています。エミュレータでこれをやっているとは言いませんでした。デバイスを接続すると問題はありません。これはエミュレータと共通していますか、それを修復する上でどれくらい重視すべきでしょうか?ありがとう。 –

+1

エミュレータは、通常、メモリがいっそう厳しく、ローエンドのデバイスに近いです。 デバイスがスキップしているフレームの数はいくつですか? この[投稿](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のパフォーマンスツール(もちろん、内蔵)へのリンクです:

あなたが使用している場合どのようなものを使用するにしても、プロファイリングツールのための見た目が変わります。

関連する問題