проблема в классе ASyncTask в Android - PullRequest
1 голос
/ 10 декабря 2010

В основном я читаю байты изображения из файла. У меня есть цикл, который должен прочитать почти 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");
    }

спасибо

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

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

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

0 голосов
/ 10 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...