2017-01-03 2 views
-1

У моего проекта есть потребность, необходимо постоянно считывать данные штрих-кода, например, сканер товарного супермаркета со сканирующими штрих-кодами, а затем данные в клавиатуру, но столкнулся с проблемой, в течение длительного времени непрерывное сканирование, загрузка процессора будет очень высокой, даже достигнув 95%, я установил поток для сна в цикле, но не смог решить эту проблему.Слишком высокое значение Cpu, до 95%

Я прошу об этой проблеме, но это может быть слишком грязный код, затрагивающий всех читателей, и теперь упрощайте код, надеюсь, вы можете мне помочь, спасибо вам большое;

Иногда несколько часов на сканировании процессора занимают слишком много, но иногда несколько дней. Grab logcat log обнаружил, что метод сна иногда не выполняется, если не непрерывное выполнение вызовет слишком высокий уровень использования процессора, но я не знаю, почему метод sleep не будет выполняться.

private void startReceive() { 
    stopReceive = false; 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      int timeout = 1000; 
      while (!stopReceive) { 
       if (mUsbDeviceConnection != null) { 
        try { 
         byte[] receiveBytes = new byte[64]; 
         int value = mUsbDeviceConnection.bulkTransfer(mUsbEndpoint, receiveBytes, 
           receiveBytes.length, timeout); 
         if (value > 0) { 
          for (int i = 2; !stopReceive && i < receiveBytes.length; i++) { 
           byte b = receiveBytes[i]; 
           if (b != 0) { 
            result += new String(new byte[]{b}); 
           } 
           if (!stopReceive && !result.equals("") && result != null) { 
            Runtime.getRuntime().exec("input text " + result); 
           } 
          } 
         } 
         Thread.sleep(100); 
        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     } 
    }).start(); 
} 
+0

Возможный дубликат [Использование процессора приложений в Android очень велико?] (Http://stackoverflow.com/questions/14688222/application-cpu-usage-is-high-in-android) –

ответ

0

Это seemd быть огромной нитью на главной-нити, которая будет существенно замедлить производительность Устройство.

Большие операции вместо этого вы должны запустить асинхронно, что означает, что она будет работать в фоновом режиме-нить и не влияет на UI-поток, который является вопрос прямо сейчас:

Вот пример того, как реализация будет выглядеть как:

private class LongOperation extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     // StartReceive code.. 
     stopReceive = false; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       int timeout = 1000; 
       while (!stopReceive) { 
        if (mUsbDeviceConnection != null) { 
         try { 
          byte[] receiveBytes = new byte[64]; 
          int value = mUsbDeviceConnection.bulkTransfer(mUsbEndpoint, receiveBytes, 
            receiveBytes.length, timeout); 
          if (value > 0) { 
           for (int i = 2; !stopReceive && i < receiveBytes.length; i++) { 
            byte b = receiveBytes[i]; 
            if (b != 0) { 
             result += new String(new byte[]{b}); 
            } 
            if (!stopReceive && !result.equals("") && result != null) { 
             Runtime.getRuntime().exec("input text " + result); 
            } 
           } 
          } 
          Thread.sleep(100); 
         } catch (Exception ex) { 
          ex.printStackTrace(); 
         } 
        } 
       } 
      } 
     }).start(); 
     return "Done"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     // We're done 
    } 

    @Override 
    protected void onPreExecute() { 
     // Before starting operation 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
    } 
} 

Как начать нить:

LongOperation longOp = new LongOperation(); 
longOp.execute(); 

подробнее: AsyncTask Android example

+0

Я попытался использовать AsyncTask, он не работает; – Victor

+0

@ Victor Что значит «это не работает»? Является ли использование процессора еще слишком высоким или возникают проблемы с самим кодом? – timbillstrom

+0

Использование CPU по-прежнему слишком велико, уровень загрузки процессора по-прежнему высок, я смотрю на источник AsyncTask, внутреннее обслуживание BlockingQueue, поэтому управление потоками действительно помогает, но в дополнение к основному потоку я использую только подрезь; используя сканирование AsyncTask от 4 до 5 часов, частота процессора повысится до максимума – Victor

1

Вы должны лучше выглядеть этот пост и попытаться найти какой метод потребляют больше системных ресурсов: https://stackoverflow.com/a/14688291/6176003

+0

Я знаю, какой метод будет потреблять больше ресурсов, но невозможно изменить ситуацию, иногда несколько часов на сканирование CPU занимают слишком много, но иногда несколько дней. Grab logcat log found метод сна иногда не выполняется, если не непрерывное выполнение вызовет слишком высокую скорость использования процессора, но я не знаю, почему метод sleep не будет выполнять – Victor

+0

Спасибо за ваш ответ, я узнал что-то дополнительное, спасибо – Victor

Смежные вопросы