проблема в классе ASyncTask в Android

1

В основном я читаю байты изображения из файла, у меня есть цикл, который должен читать почти 20 изображений из файла, и в этом цикле у меня есть объект моего класса, который расширяет класс ASyncTask, и я читаю байты и рисую на холсте в doItBackground() и установите мое изображение в методе onPostExecute(). поэтому в основном асинхронно 20 потоков начинают выполнение в фоновом режиме. теперь проблема заключается в том, что изображение не отображается.

Кто-нибудь знает, как обращаться с несколькими классами AsyncTask? вот мой код.

    @Override
    protected Void doInBackground(Void... params) 
    {
//      Log.i("start background thread", "start background thread");
        Set<Integer> keys;
        keys = iTileListOffsets.keySet();
        boolean found = false;
        Object key[] = keys.toArray();
        int k = 0;

        for (int i=0; i < key.length && found==false ; i++)
        {               
            k = (Integer) key[i];
            MapTileHeader tileHeader = iTileListOffsets.get(k);
            if (tileHeader.equalsWith(mapTile.getiMapTileHeader()) )
            {                   
                found = true; 
            }
        }

        if(found)
        {           
            try 
            {   
                synchronized (MapMaker.getSingletonObject()) 
                {
                    fc.position(0);                     
                    input.skipBytes(k);                         
                    int tSizeOfTile = input.readInt();              
                    mapTile.loadTileWithFileHeader(input, tSizeOfTile, headerBytesArray);
                }

                mapMaker.getBufferedTilesDataList().add(mapTile);                       
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            byte imageTile[] = mapTile.getImageTilesBytes();             //bufferedTile.getImageTilesBytes();                   

            if(mapTile.getImageTilesBytes() != null)
            {                       
                try
                {
                    Bitmap tileBitmap = BitmapFactory.decodeByteArray(imageTile, 0, imageTile.length);
                    canvas.drawBitmap(tileBitmap, rect.left, rect.top, null);
                    tileBitmap = null;
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }                   
            }
        }
//      Log.i("ENDDDD background thread", "ENDDD background thread");
        return null;
    }

    @Override
    protected void onPostExecute(Void result)
    {
        // TODO Auto-generated method stub
        super.onPostExecute(result);        
        Log.i("start POSTECEXCUTE thread", "start POSTECEXCUTE thread");

        MyRect mapRect = aBufferArea.GetScreenRectangle(buffer, aScrnArea); 
        Bitmap smallBitmap = Bitmap.createBitmap(bitmap, mapRect.left, mapRect.top, mapRect.width, mapRect.height);         
        image.setImageBitmap(smallBitmap);

        Log.i("ENDDDDD POSTECEXCUTE thread", "ENDDDD POSTECEXCUTE thread");
    }

спасибо

Теги:
android-asynctask

2 ответа

1
Лучший ответ

Я не думаю, что вы можете обновлять интерфейс непосредственно из doInBackground, так как код в этом методе запускается в обратном потоке и не имеет прямого доступа к потоку IU. Вы можете обновить пользовательский интерфейс от onPostExecute или от onProgressUpdate. Вы можете вызвать последнее из doInBackground, вызвав publishProgress.

В документации для AsyncTask есть простой пример, а этот немного сложнее.

0

Я хотел бы предложить немного другое отношение к проблеме. Вместо того, чтобы иметь что-то в фоновом режиме, которое загружает и рисует растровые изображения, вы можете попробовать сделать метод doInBackground для декодирования и вернуть битмап, а затем нарисовать его на холсте в onPostExecute. Это соглашение должно помешать вам разглагольствовать на холсте.

Посмотрев на код, который вы опубликовали, загруженные растровые изображения нарисованы на холсте. Затем растровое изображение отображается на изображении. Я не вижу в коде, который вы отправили, где бы ни было загружено загруженное изображение растровых изображений на экран.

Возможно, стоит дважды проверить, что изображение, которое вы рисуете, имеет достаточно большую высоту и ширину.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню