#java #android
#java #Android
Вопрос:
У меня есть такой пример:
package android.uiexample;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ProgressBar;
import android.widget.RadioGroup;
import android.widget.Toast;
import android.widget.ToggleButton;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class BasicViewsExampleActivity extends Activity
{
private static int progress = 0;
private ProgressBar progressBar;
private int progressStatus = 0;
private Handler handler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.basic_views);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
//---do some work in background thread---
new Thread(new Runnable()
{
public void run()
{
//---do some work here---
while (progressStatus < 10)
{
progressStatus = doSomeWork();
}
//---hides the progress bar---
handler.post(new Runnable()
{
public void run()
{
progressBar.setVisibility(View.GONE);
}
});
}
//---do some long lasting work here---
private int doSomeWork()
{
try {
//---simulate doing some work---
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}
return progress;
}
}).start();
}
}
В этом примере он использует обработчик для отправки выполняемого файла в exc ProgressBar.setVisibility(View.GONE);. Я не знаю, почему я не могу вызвать ProgressBar.setVisibility (View.GONE); напрямую:
//---do some work here---
while (progressStatus < 10)
{
progressStatus = doSomeWork();
}
//---hides the progress bar---
progressBar.setVisibility(View.GONE);
Кто-нибудь может сказать мне, почему я не могу?
Ответ №1:
Платформа пользовательского интерфейса Android (как и почти все предыдущие платформы пользовательского интерфейса) позволяет обновлять состояние пользовательского интерфейса только из основного потока. Возможно, вы захотите взглянуть на AsyncTask, которые включают в себя систему, необходимую для маршрутизации обновлений хода выполнения в основной поток.
Ответ №2:
Взгляните на класс Handler. Он предоставляет простой способ поставить в очередь выполняемые обратные вызовы для запуска в потоке событий пользовательского интерфейса.
Ответ №3:
изменение видимости панели выполнения — это операция пользовательского интерфейса. Все операции пользовательского интерфейса должны выполняться в потоке пользовательского интерфейса.