В основном я читаю байты изображения из файла, у меня есть цикл, который должен читать почти 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");
}
спасибо
Я не думаю, что вы можете обновлять интерфейс непосредственно из doInBackground
, так как код в этом методе запускается в обратном потоке и не имеет прямого доступа к потоку IU. Вы можете обновить пользовательский интерфейс от onPostExecute
или от onProgressUpdate
. Вы можете вызвать последнее из doInBackground
, вызвав publishProgress
.
В документации для AsyncTask есть простой пример, а этот немного сложнее.
Я хотел бы предложить немного другое отношение к проблеме. Вместо того, чтобы иметь что-то в фоновом режиме, которое загружает и рисует растровые изображения, вы можете попробовать сделать метод doInBackground для декодирования и вернуть битмап, а затем нарисовать его на холсте в onPostExecute. Это соглашение должно помешать вам разглагольствовать на холсте.
Посмотрев на код, который вы опубликовали, загруженные растровые изображения нарисованы на холсте. Затем растровое изображение отображается на изображении. Я не вижу в коде, который вы отправили, где бы ни было загружено загруженное изображение растровых изображений на экран.
Возможно, стоит дважды проверить, что изображение, которое вы рисуете, имеет достаточно большую высоту и ширину.