0

I want to show an indeterminate ProgressBar while running the code in my Asynctask, but (if I'm right) because I'm using the .get() function in the MainActivity the UI-thread freezes until the AsyncTask gives response and thus the ProgressBar won't get displayed. How can I make it so that the ProgressBar appears on screen while the UI-thread is waiting for the Asynctask to finish and return some value?

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 Answers1

0

Try to run AsyncTask without .get().

You can use interface (see original answer):

Your interface:

public interface OnTaskCompleted{
    void onTaskCompleted();
}

Your Activity:

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

And your 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();
    }
}

Another way is add setter for message in MainActivity:

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

Then just update message in .onPostExecute() in 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);
}
Grygorii
  • 162
  • 2
  • 6