简体   繁体   中英

use of asynctask inside asynctask

I wanted to use AsyncTask to load images to the ListView.

private class LoadImageTask extends AsyncTask<HashMap<String,Bitmap>,Void,Bitmap>{

    @SuppressWarnings("unchecked")
    @Override
    protected void onPostExecute(Bitmap result) {

               if(model.getIconCache().get(cellIcon)!=null){
                   icon.setImageBitmap(model.getIconCache().get(cellIcon));
                }else{
                    new LoadImageTask().execute(model.getIconCache());

                }


    }

    @Override
    protected Bitmap doInBackground(HashMap<String, Bitmap>... params) {
        //return model.getIconCache().get(cellIcon);
        return null;

    }

}

Ok, I know that this not an affective code. However it works well but with a lot of memory allocation. When reading the documentation about AsyncTask it said that Asynctask can be called only from UI thread, how could it let to use inside itself? And of course I want to make my code work inside a single AsyncTask. "model" in the code is an object that is updated at runtime through another thread. So I need to find a way to use a single Asynctask with periodically control the state of an object. How do I do that? Thanks

only do in backGround runs on backGround thread and postExecute and preExecute run on UI thread itself.. For the same reason u can show and dismiss dialogs in it..

if u want to use single Asynctask for multiple purpose u can play around by passing Different constants.. in .execute() method..

I mean something like this.

Integer Constant1 = 1;
int Constant2 = 2;

and while calling,,

new Background.execute(Constan1 or 2)

and in AsyncTask

doInBackground(Object.. arg0)
{
if(arg0.equals())
{

}
else if(arg0.equals())
{
}
}

Take a look at the asynctask documentation: http://developer.android.com/reference/android/os/AsyncTask.html

private class MyTask extends AsyncTask<Void, Integer, Boolean> {

     protected Boolean doInBackground(Void...) {
         int i = 0;
         while(true){
             publishProgress(i++);
         } 
     }

     protected void onProgressUpdate(Integer... progress) {
         myObject.setState(progress[0]);
     }
 }

You do your background stuff in the doInBackground method (which runs in the background thread).

You control the state of your object in the onProgressUpdate (which runs on the ui thread)

You send messages between the background thread and the ui thread using publishProgress. These messages could contain the state of your object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM