2010-12-10 46 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的畫布上,而不是在後臺下載和繪製位圖。這種安排應該可以防止你在畫布上爭用。

看着你發佈的代碼,加載的位圖被繪製到畫布上。然後位圖被顯示在圖像中。在您發佈的代碼中,我無法看到加載的位圖畫布發送到屏幕的任何位置。

可能值得仔細檢查一下您正在繪製的圖像的高度和寬度是否足夠大。