Android-асинхронная задача замедляет мой поток пользовательского интерфейса - PullRequest
6 голосов
/ 09 марта 2012

Я новичок в разработке приложений для Android, и у меня возникла проблема с асинхронными задачами. Поэтому я пытаюсь создать приложение для построения графиков ЭКГ, которое выполняет некоторую фоновую обработку во время выполнения графиков.

Я определил следующую асинхронную задачу -

private class Erosion extends AsyncTask <Void,Void,Void> {


    @Override
    protected Void doInBackground(Void...unused ) {

        int i,tempIndex;
        double[] tempArray = new double[13];
        double min = ecgSamples[ecgSampleForErosionIndex] - gArray[0]; 
        while (ecgIncoming)
        {
            if (ecgSampleForErosionIndex > 179999)
            {
                ecgSampleForErosionIndex = 0; 
            }

            for(i= 0;i<13;i++)
            {
                tempIndex = ecgSampleForErosionIndex + i; 
                if (tempIndex > 179999)
                {
                    tempIndex =  (ecgSampleForErosionIndex + i) - 180000;
                }
                tempArray[i] = ecgSamples[tempIndex] - gArray[i];
                if (tempArray[i] < min)
                {
                    min = tempArray[i];
                }

            }

            //min needs to be stored in the erosionFirst Array

            if (erosionFirstArrayIndex > 179999)
            {
                erosionFirstArrayIndex = 0; 
            }


            ecgErosion[erosionFirstArrayIndex] = min; 
            erosionFirstArrayIndex++;
            ecgSampleForErosionIndex++;


        }
        return null;


    }

    } //End of Async Task  

Итак, все, что я пытаюсь сделать, это изменить содержимое определенного массива в асинхронной задаче - мне не нужно обновлять интерфейс (по крайней мере, пока)

Однако, когда я запускаю эту асинхронную задачу, мой график ЭКГ замедляется и становится прерывистым. Когда я закомментирую "new Erosion (). Execute ();" В коде, где я запускаю задачу Async, график снова становится нормальным.

Разве асинхронная задача не должна выполняться в отдельном потоке и поэтому не влиять на то, как все происходит в потоке пользовательского интерфейса? Что я делаю неправильно?

Ответы [ 2 ]

8 голосов
/ 09 марта 2012

Даже если вы выполняете тяжелый фрагмент кода в фоновом потоке, это все равно повлияет на загрузку ЦП устройства и, следовательно, может вызвать задержки в потоке пользовательского интерфейса, особенно если устройство имеет одноядерный ЦП.

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

    while (ecgIncoming)
    {
      ... do your thing ...
      Thread.sleep(100); // wait for 100 milliseconds before running another loop
    }

Очевидно«100» - это просто число, если массив может обновляться раз в секунду, сделать его 1000 и т. д.

0 голосов
/ 09 марта 2012

Вы случайно не запускаете new Erosion().execute(); несколько раз? Это может быть вызвано тем, что вы выделяете новый AsyncTask несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...