Progress bar.setProgress (переменная) в фоновом потоке - PullRequest
0 голосов
/ 25 марта 2020

это мой первый вопрос по стеку (большое сообщество, спасибо!)

Итак, у меня есть эта проблема:

Я разрабатываю android приложение с макетом вкладок. Всякий раз, когда я перехожу на вкладку «Состояние», я хотел бы показать круговой ProgressBar , который обновляется в соответствии со значением переменной. Давайте назовем эту переменную prog . Кроме того, я хотел бы отобразить в центре ProgressBar TextView , который отображает то же значение prog .

Я пришел с этой частью кода:

public class StatusFragment extends Fragment
{

    private ProgressBar torqueRefProgressBar;
    private TextView torqueRefTextView;


    RunningThreadExample r;
    private Thread t1;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //Inflate the layout for this fragment
        return ...;

    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        // Initializations and other parts not relevant for the question...

        this.torqueRefProgressBar   =   getView().findViewById(R.id.torqueRefProgressBar);

        this.torqueRefTextView      =   getView().findViewById(R.id.torqueRefTextView);


        t1 = new Thread( this.torqueRefProgressBar, this.torqueRefTextView)); // passing arguments by value but values are references to the objects, therefore I'm passing by ref

        t1.start();


    }

}

В этом Фрагмент Я создаю ProgressBar и TextView, а затем передаю их в Runnable, как вы см. ниже

public class RunningThreadExample implements Runnable
{

    ProgressBar torqueRefProgBar_thread;
    TextView torqueRefTextView_thread;

    public RunningThreadExample(ProgressBar progressBar, TextView textView)
    {
        this.torqueRefProgBar_thread = progressBar;
        this.torqueRefTextView_thread = textView;
        this.endScale = this.torqueRefProgBar_thread.getMax();
    }

    @Override
    public void run()
    {
        android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

       float i = 0;

       double temp = 0;


        while(Running)
        {
            try
            {
                Thread.sleep(1000/60); // update freq 60Hz
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }

            temp = getCurrentVariableValue(); // Not shown here (returns a double)

            this.torqueRefProgBar_thread.setProgress((int) temp);
            this.torqueRefTextView_thread.setText(String.valueOf(temp));

        }

        Log.i(INFO_TAG,"Finishing thread!!!!!");

    }


}


Я бы хотел, чтобы это обновление запускалось все время, пока приложение работает (по этой причине я пренебрег AsyncTask ). Через некоторое время ProgressBar перестает обновляться, а TextView продолжает работать без каких-либо проблем.

Я читал, что возможной причиной может быть то, что вызывающий setProgress (temp) может заблокировать пользовательский интерфейс. Однако я не могу понять, пока TextView все еще работает.

Можете ли вы предложить лучший способ сделать обновление progressBar?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Вы не можете влиять на просмотр из любой темы, кроме основной. Выполните следующие действия в run() method

runOnUiThread(new Runnable() { 
// 
run(){

 this.torqueRefProgBar_thread.setProgress((int) temp);
      }      this.torqueRefTextView_thread.setText(String.valueOf(temp));
);
0 голосов
/ 25 марта 2020

См. Эту ветку:

Android основы: запуск кода в потоке пользовательского интерфейса

Итак, для подведения итогов Android требуются определенные типы и разделы кода работать в определенном c контексте. Многие инструменты, такие как обработчики, доступны для помощи в выполнении этих задач, но с самого начала было трудно научиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...