Показать ProgressBar во время выполнения задачи - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь показать индикатор выполнения только во время выполнения задачи, это мой код

public void onButtonPressed() {
        //loadingSpinner is a ProgressBar already instantiated whit visibility GONE;
        loadingSpinner.setVisibility(View.VISIBLE);
        boolean resultFromAsyncTask = AnotherClass.AsyncTaskMethod();
        if(resultFromAsyncTask ) {
            loadingSpinner.setVisibility(View.GONE);
            //do something
            finish();
        }else{
            loadingSpinner.setVisibility(View.GONE);
            //Show alert
        }
    }

Проблема в том, что когда я изменяю видимость в первый раз, ничего не происходит.Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Не усложняйте вещи, AsyncTask имеет все методы, необходимые для этого.

Установите loadingSpinner.setVisibility(View.VISIBLE); внутри onPreExecute вашей AsyncTask и установите loadingSpinner.setVisibility(View.GONE); внутри onPostExecute.

Как это:

private class YourTask extends AsyncTask<String, Void, String> { 

    @Override protected void onPreExecute(){
        loadingSpinner.setVisibility(View.VISIBLE);
    } 


    @Override 
    protected String doInBackground(String... params) { 
        //Do background work 
    }

    @Override protected void onPostExecute(String result) { 
        loadingSpinner.setVisibility(View.GONE);
    }

}
0 голосов
/ 19 ноября 2018

Опираясь на @Notsileous, вызовите метод из onPostExecute метода AsyncTask, который выполняет некоторую работу с пользовательским интерфейсом. Вам может понадобиться обернуть этот код в runOnUiThread, чтобы он работал.

Например, с вашим кодом:

public void onButtonPressed() {
        //loadingSpinner is a ProgressBar already instantiated whit visibility GONE;
        loadingSpinner.setVisibility(View.VISIBLE);
        AnotherClass.AsyncTaskMethod().execute();
}
[...]
public void doneLoading(boolean resultFromAsyncTask ) {
   runOnUiThread {
       if(resultFromAsyncTask ) {
            loadingSpinner.setVisibility(View.GONE);
            //do something
            finish();
        }else{
            loadingSpinner.setVisibility(View.GONE);
            //Show alert
        }  
    }
}
[...]
AsyncTask postExecuteMethod(boolean executionResult) {
 doneLoading(executionResult);
}
[...]

Надеюсь, это поможет уточнить! :)

0 голосов
/ 19 ноября 2018

Вы вызываете асинхронную задачу, но используете ее как обычную функцию. Вы не можете основать что-либо на результате такой асинхронной задачи, код просто запустится прямо над ней и выполнит следующие строки.
То, что вы хотите, это показать индикатор выполнения, а затем начать свою задачу без возврата, как это. Вам нужно что-то вроде трансляции от вашего onPostExecute, чтобы перезвонить вашему вызывающему классу, чтобы он знал, когда это будет сделано.
В этом случае измените **, поскольку bool по умолчанию имеет значение false, оно использует это значение в вашем операторе if и скрывает его, как только вы его показываете.

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