использование asynctask внутри asynctask - PullRequest
2 голосов
/ 18 июля 2011

Я хотел использовать AsyncTask для загрузки изображений в 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;

    }

}

Хорошо, я знаю, что это не аффективный код.Однако это работает хорошо, но с большим количеством памяти.Читая документацию об AsyncTask, он сказал, что Asynctask может вызываться только из потока пользовательского интерфейса, как он может позволить использовать внутри себя?И, конечно же, я хочу, чтобы мой код работал внутри одного AsyncTask.«Модель» в коде - это объект, который обновляется во время выполнения через другой поток.Поэтому мне нужно найти способ использовать одну Asynctask с периодическим контролем состояния объекта.Как я могу это сделать?Спасибо

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

только в backGround запускается в потоке backGround, а postExecute и preExecute запускаются в самом потоке пользовательского интерфейса. По той же причине вы можете показывать и закрывать диалоги в нем ..

, если вы хотите использовать одну Asynctask длянесколько целей вы можете поиграть, передав различные константы .. в .execute() метод ..

Я имею в виду что-то вроде этого.

Integer Constant1 = 1;
int Constant2 = 2;

и во время вызова ,,

new Background.execute(Constan1 or 2)

и в AsyncTask

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

}
else if(arg0.equals())
{
}
}
2 голосов
/ 18 июля 2011

Взгляните на документацию по асинхронной задаче: 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]);
     }
 }

Вы делаете свои фоновые вещи в методе doInBackground (который запускается в фоновом потоке).

Вы управляете состоянием вашего объекта в onProgressUpdate (который выполняется в потоке пользовательского интерфейса)

Вы отправляете сообщения между фоновым потоком и потоком пользовательского интерфейса, используя publishProgress. Эти сообщения могут содержать состояние вашего объекта.

...