title: Choreographer: Skipped frames : The application may be doing too much work on its main thread
body: <p>In my android application I am getting &quot;The application may be doing too much work on its main thread&quot; as warning and api call taking to much time to make response.I showed it with an example.I have a radio button with 2 cases each will make an api call on click and result will show a list of data to users.Below is my code.</p>
  <pre><code>protected void onCreate(Bundle savedInstanceState) {
      /**   Other code **/
      rdbGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
              pos = radioGroup.indexOfChild(findViewById(checkedId));
              switch (pos) {
                  case 0:
                      if (screenType == 1) {
                          getClassTeacherList();
                      } else {
                          rcyTeachers.setVisibility(View.GONE);
                      }
                      fabAddClassTeacher.setTitle(&quot;Add class teacher&quot;);
                      return;
                  case 2:
                      if (screenType == 1) {
                          getAcademicTeachersList();
                      } else {
                          rcyTeachers.setVisibility(View.GONE);
                      }
                      fabAddClassTeacher.setTitle(&quot;Add Teacher&quot;);
                      return;
                  default:
              }
          }
      });
  
  private void getClassTeacherList() {
      academicPeriod = (AcademicPeriod) mSpnPeriod.getItemAtPosition(keyPos);
      if (isServerReachable(getApplicationContext())) {
          classTeacherList = serverAuthenticateService.getClassTeacherList(selClass.getId(),academicPeriod.getId(), authtoken, getApplicationContext());
          if (AppBackupCache.checkToken == 200) {
              showClassTeacherList();
          } else if (AppBackupCache.checkToken == 401) {
              manager.invalidateAuthToken(&quot;com.lss.loop&quot;, authtoken);
              authtoken = null;
              final AccountManagerFuture&lt;Bundle&gt; future = manager.getAuthToken(mAccount, AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS, new Bundle(), true, null, null);
              new Thread(new Runnable() {
                  public void run() {
                      try {
                          Bundle bnd = (Bundle) future.getResult();
                          authtoken = bnd.getString(&quot;authtoken&quot;);
                          if (authtoken != null) {
                              classTeacherList = serverAuthenticateService.getClassTeacherList(selClass.getId(),academicPeriod.getId(), authtoken, getApplicationContext());
                              if (AppBackupCache.checkToken == 200) {
                                  showClassTeacherList();
                                  return;
                              } else {
                                  getMsgBox(&quot;Error&quot;, &quot;Something went wrong&quot;);
                                  return;
                              }
                          }
  
                          getMsgBox(&quot;&quot;, &quot;Token not refreshed....&quot;);
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              }).start();
          }
          AppBackupCache.checkToken = 401;
          return;
      }
      getMsgBox(&quot;No connection&quot;, &quot;No connection&quot;);
  }
  
  public boolean isServerReachable(Context applicationContext) {
      ConnectivityManager connMan = (ConnectivityManager) applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);
      NetworkInfo netInfo = connMan.getActiveNetworkInfo();
      if (netInfo != null &amp;&amp; netInfo.isConnected()) {
          try {
              URL urlServer = new URL(strUrl);
              HttpURLConnection urlConn = (HttpURLConnection) urlServer.openConnection();
              urlConn.setConnectTimeout(3000); //&lt;- 3Seconds Timeout
              urlConn.connect();
              return urlConn.getResponseCode() == 200;
          } catch (MalformedURLException e1) {
              return false;
          } catch (IOException e) {
              return false;
          }
      }
      return false;
      //return true;
  }
  
  
  private void showClassTeacherList() {
      runOnUiThread(new Runnable() {
          @Override
          public void run() {
              if (classTeacherList.size() &gt; 0) {
                  rcyTeachers.setVisibility(View.VISIBLE);
                  linLayColor1.setVisibility(View.VISIBLE);
                  linLaySub.setVisibility(View.GONE);
                  classTeacherGridAdapter = new ClassTeacherGridAdapter(ClassTeacherActivity.this, classTeacherList, fontFamily, screenType, 1);
                  rcyTeachers.setAdapter(classTeacherGridAdapter);
                  ViewCompat.setNestedScrollingEnabled(rcyTeachers, true);
                  return;
              }
              rcyTeachers.setVisibility(View.GONE);
              linLayColor1.setVisibility(View.GONE);
          }
      });
  }
  </code></pre>
  <p>ServerAuthenticateService.java :</p>
  <pre><code>@Override
  public List&lt;ClassTeacher&gt; getClassTeacherList(int classId, int academicId, String authtoken, Context applicationContext) {
      HttpHeaders headers = new HttpHeaders();
      headers.set(&quot;Authorization&quot;, &quot;bearer &quot; + authtoken);
      MultiValueMap&lt;String, String&gt; map = new LinkedMultiValueMap();
      map.add(&quot;classId&quot;, String.valueOf(classId));
      map.add(&quot;academicId&quot;, String.valueOf(academicId));
      ResponseEntity&lt;String&gt; restRes = this.restTemplate.exchange(apiUrl + &quot;/getClassTeacherList&quot;, HttpMethod.POST, new HttpEntity(map, headers), String.class, new Object[0]);
      if (restRes.getStatusCode() == HttpStatus.OK) {
          AppBackupCache.checkToken = ItemTouchHelper.Callback.DEFAULT_DRAG_ANIMATION_DURATION;
          String resBody = (String) restRes.getBody();
          Type listType = new TypeToken&lt;List&lt;ClassTeacher&gt;&gt;() {}.getType();
          List&lt;ClassTeacher&gt; allActPgmMap = (List) this.gson.fromJson(resBody, listType);
          return allActPgmMap;
      } else if (restRes.getStatusCode() == HttpStatus.UNAUTHORIZED) {
          AppBackupCache.checkToken = 401;
          return null;
      } else {
          AppBackupCache.checkToken = 402;
          return null;
      }
  }
  </code></pre>
  <p>Below is the warming i am getting.</p>
  <pre><code>I/Choreographer: Skipped 687 frames!  The application may be doing too much work on its main thread.
  I/OpenGLRenderer: Davey! duration=11662ms; Flags=0, IntendedVsync=1315104621338, Vsync=1326554620880, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=1326567046366, AnimationStart=1326567174126, PerformTraversalsStart=1326567180324, DrawStart=1326747726176, SyncQueued=1326760565187, SyncStart=1326761318573, IssueDrawCommandsStart=1326761742323, SwapBuffers=1326766654823, FrameCompleted=1326767746542, DequeueBufferDuration=298000, QueueBufferDuration=332000, 
  
   I/Choreographer: Skipped 682 frames!  The application may be doing too much work on its main thread.
   I/OpenGLRenderer: Davey! duration=11418ms; Flags=0, IntendedVsync=1354296057548, Vsync=1365662723760, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=1365665791303, AnimationStart=1365665859063, PerformTraversalsStart=1365665871094, DrawStart=1365707384015, SyncQueued=1365711047505, SyncStart=1365711676880, IssueDrawCommandsStart=1365712054224, SwapBuffers=1365714258860, FrameCompleted=1365715220318, DequeueBufferDuration=243000, QueueBufferDuration=341000, 
  </code></pre>
  <p>In my application, I have lots of API calls and most of the time I am getting this warning, what should I do to avoid this and make my request and application work faster?</p>