2

Привет Я получаю это сообщение в журнале каждый раз при выполнении запроса. Но запрос выполняется только в фоновом потоке, а таблица имеет не более 500 строк, а также я всегда применяю предел 100. Просьба не просто дать ссылку и ответить на этот вопрос.Приложение, показывающее слишком много работы в основном потоке, даже если операции выполняются в фоновом потоке

Я прочитал много ответов в SO относительно этого. Но все же это не решило мою проблему. может ли кто-нибудь дать мне надлежащую причину или решение моей проблемы?

Хореограф: пропущено 98 кадров! Приложение может делать слишком много работы над своей основной нитью.

Ниже приведен мой класс runnable, и я называю его как новый поток (новый MessageLoaderThread (limit)). Start();

private class MessageLoaderThread implements Runnable { 

     int limit; 
     ArrayList<MESSAGE_HEADER> result; 

     public MessageLoaderThread(int limit) { 
      this.limit = limit; 
     } 

     @Override 
     public void run() { 

      showProgressRing(true); 

      result = Helper.getRows("Select * from TABLE_NAME LIMIT "+limit); 

        if (result != null) { 
         int count = result.size(); 

         if (count > 0) { 
          firstVisibleMessageSeqId = result.get(0).getsequenceId(); 
          lastVisibleMessageSeqId = result.get(count - 1).getsequenceId(); 
         } 
        } 

      if (result != null && result.size() > 0) { 
       updateAdapter(result); 
      } 
      showProgressRing(false); 
     } 
    } 

Благодаря

+0

Я не сразу вижу проблему. Возможно, потребуется полная [mcve]. – Knossos

+0

Возможно, вы слишком много работаете внутри «updateAdapter (result)» _ –

ответ

0

Я знаю, что вы уже читали много вопросов. Вы пытались использовать AsyncTask? Его значение по умолчанию для многопоточности в Android.

Попробуйте не обновлять адаптер внутри своей нити. Android выполняет некоторые анимации, когда вы меняете некоторые виды. Подождите, пока поток закончится, а затем обновите представление.

+0

Я попробовал asynctask У меня была такая же проблема, поэтому по этой причине я перешел к концепции Thread. – ImGenie

+0

Вы не должны вызывать операцию просмотра в фоновом потоке. Попробуйте обновить адаптер после завершения потока. Попробуйте обновить адаптер в [postExecute] (http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute%28Result%29) – ikkarion

0

Если вы все еще получаете предупреждение после использования AsyncTask, это, вероятно, связано с тем, что операции по-прежнему тяжелые и длительные. Попробуйте использовать другой APIs из java.util.concurrent как предложено в AsyncTaskdocumentation

AsyncTask разработана, чтобы быть вспомогательным классом вокруг Thread и обработчика и не является общей основой потоковой. AsyncTasks в идеале следует использовать для коротких операций (несколько секунд в ). Если вам нужно поддерживать непрерывные потоки, настоятельно рекомендуется использовать различные API-интерфейсы, предоставляемые java.util . параллельный пакет, такой как Исполнитель, ThreadPoolExecutor и FutureTask.

+0

Спасибо :) @AndroidMechanic Я попробую и позволю вам знать. – ImGenie