это мой первый вопрос по стеку (большое сообщество, спасибо!)
Итак, у меня есть эта проблема:
Я разрабатываю 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?
Спасибо!