基本上我正在从文件中读取图像字节我有一个循环,它必须从文件中读取近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");
}
谢谢
答案 0 :(得分:1)
我认为您不能直接从doInBackground
更新UI,因为此方法中的代码在后台线程中运行,并且无法直接访问IU线程。您可以从onPostExecute
或onProgressUpdate
更新用户界面。您可以通过调用doInBackground
从publishProgress
调用后者。
AsyncTask的文档中有一个简单的例子,this one稍微复杂一些。
答案 1 :(得分:0)
我想建议一种略微不同的思考方式。您可以尝试使doInBackground方法解码并返回Bitmap,然后在onPostExecute中将其绘制到画布上,而不是在后台下载和下载位图。这种安排可以防止你在画布上争用。
查看您发布的代码,加载的位图将被绘制到画布上。然后位图显示在图像中。在您发布的代码中,我无法看到加载的位图画布被发送到屏幕的任何地方。
值得仔细检查一下,你要绘制的图像有足够大的高度和宽度。