2013-05-15 24 views
5

ho provato molti suggerimenti ma niente funziona! Quando chiamo Thread.sleep() in filo di fondo, thread principale congela anche per questa volta (animazione drop frame) :(Android Thread.sleep() in blocco AsyncTask UI

Versione 1:

public void UpdateChannels(final ArrayList<Channel> channels) 
{ 
    new AsyncTask<ArrayList<Channel>, Object[], Void>() 
    { 
     @Override 
     protected Void doInBackground(ArrayList<Channel>... arrayLists) 
     { 
      for(Channel channel : arrayLists[0]) 
      { 
       Integer chid = new Integer(channel.arfcn); 
       ChannelRect channelRect = Channels.get(chid); 
       publishProgress(new Object[] {channelRect, channel.dBm}); 

       try 
       { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Object[]... values) 
     { 
      ChannelRect channelRect = (ChannelRect) values[0][0]; 
      int value = (Integer)values[0][1]; 
      channelRect.setValue(value); 
      channelRect.Animate(); 
     } 
    }.execute(channels); 
} 

Versione 2:

public void UpdateChannels(final ArrayList<Channel> channels) 
{ 
    new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      for(final Channel channel : channels) 
      { 
       int chid = new Integer(channel.arfcn); 
       final ChannelRect channelRect = Channels.get(chid); 
       if(channelRect != null) 
       { 
        CurrentActivity.runOnUiThread(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          channelRect.setValue(channel.dBm); 
          channelRect.Animate(); 
         } 
        }); 
        try 
        { 
         Thread.sleep(500); 
        } catch (InterruptedException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    }).start(); 
} 

E ho provato la stessa cosa con Post e Handler.La stessa cosa :(Quando Thread.sleep (500) arriva l'animazione si blocca :(

Cosa sto facendo male?

UPDATE 1

Trovato luogo pesante che rallenta thread UI:

ho LinearLayout orizzontale che memorizza 175 viste ChannelRect. Quando chiamo animate (che inizia AlphaAnimation tutto bene, ma quando ho setValue() per ChannelRect deve cambiare la sua dimensione:

public void setValue(int value) 
{ 
    _value = value; 
    setOpacity((byte)255); 
    CurrentLayoutParams.height = (int)((-110 - value) * ycoeff * -1); 
    requestLayout(); 
} 

Si tratta di rallentamenti principale thread UI Perché setValue colpisce solo un punto di vista in questo LinearLayout.? non è tutto ... ps rimozione() linea requestLayot rimuovere rallentamenti ma non ChannelRect dimensioni modifiche :(

+0

il problema non è in relazione con questo codice – Blackbelt

+0

non esiste un codice pesante in channelRect.setValue (valore) o in channelRect.Animate() –

+0

Non ho mai detto che fosse lì. – Blackbelt

risposta

3

Il motivo per cui l'animazione si blocca è un requestLayout() in ChannelRect. principale LinearLayout che contiene molti (175 +) visualizzazioni personalizzate cercando di ridisegnare ogni bambino su requestLayout() chiamato dal figlio aggiornato

che sto cambiato la mia ChannelRect per disegnare rettangolo di vista interna e ora chiamata a invalidate() invece requestLayout():

public void setValue(int value) 
{ 
    _value = value; 
    setOpacity((byte)255); 
    invalidate(); 
} 

@Override 
protected void onDraw(Canvas canvas) 
{ 
    canvas.drawRect(0,getHeight() - (int)((-110 - _value) * ycoeff * -1),size,getHeight(), pnt); 
} 
+0

lol, Ho davvero tremato;) – Snicolas