2010-12-10 30 views
1

fondamentalement je lis des octets d'image à partir du fichier j'ai une boucle qui doit lire près de 20 images du fichier et dans cette boucle j'ai fait l'objet de ma classe qui étend la classe ASyncTask et je suis lecture d'octets et dessin sur toile dans doItBackground() méthode et définition de mon image sur la méthode onPostExecute(). Donc, fondamentalement, 20 threads asynchrone démarre l'exécution en arrière-plan. maintenant le problème est qu'il ne montre aucune image.problème est dans la classe ASyncTask dans Android

Quelqu'un at-il une idée de la façon de gérer plusieurs classes AsyncTask? voici mon code.

@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"); 
    } 

grâce

Répondre

1

Je ne pense pas que vous pouvez mettre à jour l'interface directement à partir de doInBackground, car le code de cette méthode est exécuté dans un thread backgound et n'a pas accès direct au thread IU. Vous pouvez mettre à jour l'interface utilisateur à partir de onPostExecute ou de onProgressUpdate. Vous pouvez appeler ce dernier de doInBackground en appelant publishProgress.

Il existe un exemple simple dans la documentation pour AsyncTask, et this one est un peu plus complexe.

0

Je voudrais suggérer une façon légèrement différente de penser au sujet du problème. Au lieu d'avoir une chose en arrière-plan qui télécharge et dessine les bitmaps, vous pouvez essayer de faire décoder la méthode doInBackground et retourner le bitmap, puis le dessiner sur le canvas dans onPostExecute. Cette disposition devrait vous éviter d'avoir des conflits sur la toile.

En regardant le code que vous avez posté, les bitmaps chargés sont dessinés sur le canevas. Puis bitmap est affiché dans l'image. Je ne peux pas voir, dans le code que vous avez posté, n'importe où que le canevas bitmaps chargé est envoyé à l'écran.

Il peut être utile de vérifier que l'image que vous dessinez a une hauteur et une largeur suffisantes.