Returning data from AsyncTask without blocking UI

前端 未结 3 1530
逝去的感伤
逝去的感伤 2021-02-05 12:32

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

相关标签:
3条回答
  • 2021-02-05 12:43

    You don't get the result this way. See this link for an example : https://github.com/levinotik/ReusableAsyncTask/tree/master/src/com/example

    Basically, here is what you need to do :

    • Define an interface (= a listener) that your activity implements
    • Set the listener in the asynctask
    • Call yourListener.yourMethod() in the onPostExecute
    0 讨论(0)
  • 2021-02-05 12:45

    When an asynchronous task is executed, the task goes through 4 steps:

    1.onPreExecute(), invoked on the UI thread before the task is executed. use this to diaply progress dialog.
    
    2.doInBackground(Params...), invoked on the background thread immediately after onPreExecute() finishes executing. Can also use publishProgress(Progress...) to publish one or more units of progress. These values are published on the UI thread, in the onProgressUpdate(Progress...) step.
    
    3.onProgressUpdate(Progress...), invoked on the UI thread after a call to publishProgress(Progress...). Used to publish progress.
    
    4.onPostExecute(Result), invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter.
    

    In your activity onCreate()

        TextView tv;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);
        tv= (TextView)findViewById(R.id.textView);
        new TheTask().execute();
    
      }
    class TheTask extends AsyncTask<Void, Void,String> {
    
      protected void onPreExecute() {
      //dispaly progress dialog
     }
    
     protected String doInBackground(Void... params) {
       //do network operation
         return "hello"; 
     }
    
     protected void onPostExecute(String result) {  
      //dismiss dialog. //set hello to textview
          //use the returned value here.
         tv.setText(result.toString());
     }
     }
    

    Consider using robospice (An alternative to AsyncTask. https://github.com/octo-online/robospice.

    Make asynchronous calls, Notifies on the ui thread.

    0 讨论(0)
  • 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

    0 讨论(0)
提交回复
热议问题