2010-12-10 74 views
1

基本上我正在阅读从文件的图像字节我有一个循环,必须从文件中读取近20个图像,并在此循环中,我已使我的类的对象,它扩展了ASyncTask类,我是读取字节并在画布上绘制doItBackground()方法并在onPostExecute()方法上设置我的图像。所以基本上异步20线程开始在后台执行。现在的问题是它没有显示任何图像。问题是在Android的ASyncTask类

任何人有任何想法如何处理多个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"); 
    } 

感谢

回答

1

我不认为你可以直接从doInBackground更新UI,因为此方法中的代码在backgound线程中运行,并且不能直接访问IU线程。您可以从onPostExecuteonProgressUpdate更新UI。您可以致电publishProgress致电doInBackground中的后者。

在AsyncTask的文档中有一个简单的例子,this one稍微复杂一点。

0

我想建议思考问题的方式略有不同。您可以尝试制作doInBackground方法解码并返回位图,然后将其绘制到onPostExecute的画布上,而不是在后台下载和绘制位图。这种安排应该可以防止你在画布上争用。

看着你发布的代码,加载的位图被绘制到画布上。然后位图被显示在图像中。在您发布的代码中,我无法看到加载的位图画布发送到屏幕的任何位置。

可能值得仔细检查一下您正在绘制的图像的高度和宽度是否足够大。