Учитывая простой код, как это:почему UI процессы до тяжелого процесса не выполняются первый
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInastanceState){
super.onCreate(savedInastanceState);
setContentView(R.layout.main);
final ProgressDialog pdUpdate = new ProgressDialog(this);
final Button btn = (Button)findViewById(R.id.btnUpdate);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
btn.setText(Calendar.getInstance().getTime().toString());
int i=0;
while (i<100){
i++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("test","i = " + i);
}
}
});
}
}
, нажав на btn
две вещи должны произойти: изменение текста кнопки и подсчета i
100 с задержками 100 мсек (это просто пример симуляции тяжелого процесса, такого как чтение файла, загрузка и т. д.).
Я знаю, что правильный способ реализации таких кодов - использовать AsyncTask
, но мой вопрос о том, как этот код скомпилирован. Это приложение с одним потоком. Поэтому компилятор сначала читает btn.setText(Calendar.getInstance().getTime().toString());
и переходит к следующим строкам кода только после выполнения этой строки (пожалуйста, исправьте меня, если я ошибаюсь), но этого не происходит. Зачем?
В C#
существует метод Refresh()
, который решает эту проблему (просто вызовите его после изменения пользовательского интерфейса и внесения изменений). Есть ли какой-либо подобный метод в java?
Я ценю любую помощь.
РЕДАКТИРОВАТЬ 1
есть речь идет о порядке следующих процессов:
Процесс 1:
btn.setText(Calendar.getInstance().getTime().toString());
Способ 2:
i++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("test","i = " + i);
}
Независимо от того, какой из них приходит первым (Я имею в виду либо btn.onClick(){process1;process2;}
, либо btn.onClick(){process2;process1;}
), всегда выполняется второй процесс. В первую очередь я вижу подсчет i
в Logcat, а затем вижу изменение текста кнопки.
Вы спали в общей сложности 9,9 секунды. Я не знаю, почему вам нужно знать, как скомпилирован код, если вы не планируете писать компиляционную библиотеку, такую как lambdas или injection. Я не уверен, что вы на самом деле спрашиваете. –
Он не имеет ничего общего с компиляторами, но поток UI ... вы устанавливаете текст и блокируете поток пользовательского интерфейса ... поэтому явно не было времени перерисовать ... в C# есть 'Application.DoEvents();' но это плохой выбор человека ... – Selvin
Я ожидаю увидеть изменение пользовательского интерфейса, а затем подсчитаю 'i' в' Logcat'. Но случается так, что первый подсчет, а затем изменение пользовательского интерфейса. – Behy