Returning data from AsyncTask without blocking UI

android, android-asynctask

Solution

`get() method will block the UI thread`. To get the relavent data you need to return the value from doInBackground and capture the value in onPostExecute parameter.

Value returned by doInBackground is captured by onPostExecute method

Example:

public class BackgroundTask extends AsyncTask<String, Integer, String >{
       private ProgressDialog mProgressDialog;
       int progress;
       public BackgroundTask() {
           mProgressDialog = new ProgressDialog(context);
             mProgressDialog.setMax(100);
             mProgressDialog.setProgress(0);
    }

       @Override
    protected void onPreExecute() {
           mProgressDialog =ProgressDialog.show(context, "", "Loading...",true,false);
        super.onPreExecute();
    }
     @Override
     protected void onProgressUpdate(Integer... values) {
     setProgress(values[0]);
  }

    @Override
    protected String doInBackground(String... params) {
            String data=getDatafromMemoryCard();    

        return data;  // return data you want to use here
    }
    @Override
    protected void onPostExecute(String  result) {  // result is data returned by doInBackground
        Toast.makeText(context, result, Toast.LENGTH_LONG).show();
        mProgressDialog.dismiss();
        super.onPostExecute(result);
    }
   }

If you are using asynctask in separate class, then use AsyncTask with callback interface like this

Here is the answer I have provided earlier about the same AsyncTask with Callback

Problem

I have a conceptual problem related to `AsyncTask` class. We use `AsyncTask` so that the main UI is not blocked. But suppose, I want to retrieve some data from the device's memory, and I use AsyncTask class for this. The relevant line of the code will be as follows (assuming the data type returned is String): ``` //code String data = new ExtendedAsyncTask().execute(param1, param2).get(); //use this returned value. ``` Won't the above line block the UI, defeating the purpose of using the `AsyncTask` ? If yes, then how do I get the relevant data without blocking UI ? I would like to add that the next line of code will need this data to perform some task, and hence depends on the returned value. Thanks

Original source

Related problems