Код в объекте AsyncTask не выполняется параллельно
Привет
Программа - взаимодействует с электронным прибором проблема - вызываю 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) {
}
//----------------------------------------------------------------------------------
}
});
}
Источник: Stack Overflow на русском