2010-12-10 5 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

このメソッドのコードはバックグラウンドスレッドで実行され、IUスレッドに直接アクセスできないため、doInBackgroundから直接UIを更新することはできません。 UIを更新するには、onPostExecuteまたはonProgressUpdateのいずれかを入力します。これらの後者はdoInBackgroundからpublishProgressに電話することができます。

ドキュメントにAsyncTaskの簡単な例があり、this oneはもう少し複雑です。

0

私はこの問題を考えるのわずかに異なる方法を提案したいと思います。バックグラウンドでビットマップをダウンロードして描画するものを使用する代わりに、doInBackgroundメソッドをデコードしてビットマップを返してから、onPostExecuteのキャンバスに描画するようにしてください。これにより、キャンバス上での競合を防ぐことができます。

投稿したコードを見ると、読み込まれたビットマップがキャンバスに描画されます。その後、ビットマップがイメージに表示されます。あなたが投稿したコードでは、読み込まれたビットマップキャンバスが画面に送られる場所はどこにも見えません。

描画するイメージの高さと幅が十分に大きいことを確認する必要があります。

関連する問題