показать ProgressBar с AsyncTask.execute (). get () - PullRequest
0 голосов
/ 30 августа 2018

Я хочу показать неопределенный ProgressBar при выполнении кода в моей Asynctask, но (если я прав), потому что я использую функцию .get () в MainActivity, поток пользовательского интерфейса останавливается, пока AsyncTask не даст ответ и, таким образом, ProgressBar не будет отображаться. Как я могу сделать так, чтобы ProgressBar появлялся на экране, пока поток пользовательского интерфейса ожидает завершения Asynctask и возврата некоторого значения?

MainActivity

public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);
}

public void showSpinner(View view){
    CustomAsyncTask customAsyncTask = new CustomAsyncTask(this);
    customAsyncTask.setProgressBar(progressBar);
    try {
        String message = customAsyncTask.execute().get();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Toast.makeText(this,
            "Time is up", Toast.LENGTH_LONG).show();
}}

AsyncTask

public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {

Context context;
CustomAsyncTask(Context ctx) {
    context = ctx;
}

ProgressBar progressBar;
public void setProgressBar(ProgressBar progressBar) {
    this.progressBar = progressBar;
}

@Override
protected String doInBackground(Void... voids) {
    SystemClock.sleep(2000);
    String message = "hello world";
    return message;
}

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

@Override
protected void onPostExecute(String message) {
    progressBar.setVisibility(View.GONE);
}}

1 Ответ

0 голосов
/ 30 августа 2018

Попробуйте запустить AsyncTask без .get().

Вы можете использовать интерфейс ( см. Оригинальный ответ ):

Ваш интерфейс:

public interface OnTaskCompleted{
    void onTaskCompleted();
}

Ваша деятельность:

public MainActivity extends AppCompatActivity implements OnTaskCompleted{
    //your MainActivity
}

И ваш AsyncTask:

public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {
    private OnTaskCompleted listener;

    public CustomAsyncTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    //required methods

    protected void onPostExecute(Object o){
        //your stuff
        listener.onTaskCompleted();
    }
}

Другой способ - добавить установщик для message в MainActivity:

public class MainActivity extends AppCompatActivity {
//...
private String message;
public void setMessage(String message) {
    this.message = message;
}
// ...
customAsyncTask.execute();

Затем просто обновите message в .onPostExecute() в CustomAsyncTask:

public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {
//...
@Override
protected void onPostExecute(String message) {
    progressBar.setVisibility(View.GONE);
    MainActivity activity = (MainActivity) context;
    activity.setMessage(message);
}
...