Код в объекте AsyncTask не выполняется параллельно

Рейтинг: 0Ответов: 1Опубликовано: 15.10.2014

Привет

Программа - взаимодействует с электронным прибором проблема - вызываю asyncTask, хочу, чтобы progressBar увеличивался, когда принимается посылка от прибора. Однако AsyncTask выполняется после того, как отработает весь код в обработчике кнопки - тогда progressBar заполняется весь сразу.

В чём ошибка? Вызывать AsyncTask из progressBar я так понял можно. Код сокращён

@SuppressLint("ValidFragment") public class DeviceUARTFragment extends Fragment{

        class MyTask extends AsyncTask<String, Integer, Void> {

            int myProgressCount;

            @Override
            protected void onPreExecute() {
                   Toast.makeText(DeviceUARTContext, "onPreExecute Start Progress Bar", Toast.LENGTH_LONG).show();
                   progressBar.setProgress(0);
                   myProgressCount = 0;
            }

            @Override
            protected Void doInBackground(String... urls) {
                    //publishProgress();
                    //onProgressUpdate();
                  //progressBar.incrementProgressBy(10);
                  //Toast.makeText(DeviceUARTContext, "AsyncTask", Toast.LENGTH_LONG).show();

                  //progressBar.setProgress(0);
                  //myProgressCount = 0;
                while (myProgressCount < 100) {
                    myProgressCount++;
                    /**
                     * Runs on the UI thread after publishProgress(Progress...) is
                     * invoked. The specified values are the values passed to
                     * publishProgress(Progress...).
                     *
                     * Parameters values The values indicating progress.
                     */

                    publishProgress(myProgressCount);
                    SystemClock.sleep(2500);
              }         
                return null;
            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                   // TODO Auto-generated method stub
                   progressBar.setProgress(values[0]);
            }

            @Override
            protected void onPostExecute(Void result) {
                   Toast.makeText(DeviceUARTContext, "onPostExecute End Progress Bar",
                                Toast.LENGTH_LONG).show();
                   /**
                    * enable Button back so user can click again
                    */

            }

         }

        MyTask mt;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,

        Bundle savedInstanceState) {

        if (container == null) {
            return null;
        }

        super.onCreate(savedInstanceState);

        View view = inflater.inflate(R.layout.device_uart, container, false);
        }

        ReadDataBut = (Button) view.findViewById(R.id.button12);
        ReadDataBut.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                clickedButton = v.getId();

                //progressBar = (ProgressBar) view.findViewById(R.id.progressBar1);
                //progressBar.setProgress(33);

                byte[] wakeUpCommand = {0x55};

                for(int i=0; i<20000; i++)
                {
                    ftDev.write(wakeUpCommand, wakeUpCommand.length);
                }

                //progressBar.setProgress(0);
                //percent.setText("Считывание архива... ");
                //try{

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                for (int i=0; i<packetIntervals.length; i++)
                {
                    packetIntervals[i] = (char)(i*packetSize);
                }

                for (int i=0; i<packetIntervals.length; i++)
                {

                    readPacket[9] = (byte)(packetIntervals[i] & 0xFF);
                    readPacket[10] = (byte)((packetIntervals[i] >> 8) & 0xFF);

                    readPacket[readPacket.length - 1] = (byte)((getLRC(readPacket) >> 8) & 0xFF);
                    readPacket[readPacket.length - 2] = (byte)(getLRC(readPacket) & 0xFF);

                    ftDev.write(readPacket, readPacket.length);

                    try {
                        Thread.sleep(2500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    // периодически приходит посылка. надо      инкрементировать полоску progressBar-а при приходе этой посылке. но AsyncTask выполняется после того, как отработает весь код в обратчике кнопки
                    answ_buff_cnt = 0;

                    mt = new MyTask();
                    mt.execute();

                    if ( ((byte)((getLRC(answer_buffer) >> 8) & 0xFF) != answer_buffer[answer_buffer.length-1]) ||
                          ((byte)(getLRC(answer_buffer) & 0xFF) != answer_buffer[answer_buffer.length-2]) ) 
                    {
                          Toast.makeText(DeviceUARTContext, "Ошибка принятых данных. Начните чтение ПЗУ снова", Toast.LENGTH_SHORT).show();
                          break;
                    }

                    byte[] pureData = new byte[packetSize];
                    System.arraycopy(answer_buffer, 9, pureData, 0, packetSize);

                    System.arraycopy(pureData, 0, archive, i*packetSize, packetSize);

                    //float percentDiscrete = 100/32;

                }

                byte[] pointer = {0};

                try{

                    // чтение, модификация и запись указателя на файл-контейнер и файла-контейнера
                    if (periodCheckBox.isChecked())
                    {
                        selectedItemNum = EEPROMSSpinner.getSelectedItemPosition();
                        fileContainer.set(EEPROMSSpinner.getSelectedItemPosition(), archive);
                    }
                    else
                    {

                        FileInputStream pointerFileInput = new FileInputStream(pointerFile); 
                        pointerFileInput.read(pointer);
                        pointerFileInput.close();

                        fileContainer.set(pointer[0], archive);

                        pointer[0]++;
                        if (pointer[0] == 60)
                        {
                            pointer[0] = 0;
                        }
                        FileOutputStream pointerFileOutput = new FileOutputStream(pointerFile);
                        pointerFileOutput.write(pointer[0]);  
                        pointerFileOutput.close();

                    }

                    // запись обновлённого файла-контейнера                 
                    for (int i = 0; i<60; i++)
                    {
                        System.arraycopy(fileContainer.get(i), 0, _60_archives, archiveSize*i, archiveSize);
                    }

                    FileOutputStream fileOutput = new FileOutputStream(file);
                    fileOutput.write(_60_archives);  
                    fileOutput.close();

                    // заполнение коллекции
                    for (int i = 0; i < 60; i++)
                    {
                        archive = Arrays.copyOfRange(_60_archives, i*archiveSize, i*archiveSize + archiveSize);
                        fileContainer.add(archive);
                    }
                    fillSpinner(v);

                }
                catch (Exception e) {

                }

                //----------------------------------------------------------------------------------

            }

        });

}

Ответы

▲ 2

Если коротко - тяжелый код у вас работает в главном потоке, а в другой поток вы вынесли цикл, который ничего не делает, кроме как работает с progressbar. Весь код работы с устройством нужно засунуть в doInBackground, обработку результата работы надо засунуть в onPostExecute.