Поток в Android

#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:

изменение видимости панели выполнения — это операция пользовательского интерфейса. Все операции пользовательского интерфейса должны выполняться в потоке пользовательского интерфейса.