2013-05-15 28 views
5

Birçok öneride bulundum ama hiçbir şey işe yaramıyor! i arka iplik Thread.sleep() aramak, ana iplik de bu kez (Animasyon çerçeve düşüşü) donar :(Android Thread.sleep() in AsyncTask freeze UI

Sürüm 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); 
} 

Versiyon 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(); 
} 

Ve aynı şeyi denedim ve Handler aynı şey :(Thread.sleep (500) geldiğinde animasyon donuyor :(

Neyi yanlış yapıyorum?

UI iş parçacığı yavaşlatır

GÜNCELLEME 1

Bulunan ağır Yer:

ben 175 ChannelRect görüşlerini depolayan yatay LinearLayout var. i animate çağırdığınızda (yani AlphaAnimation tüm tamam başlar, ama ben SetValue zaman() onun boyutunu değiştirmek gerekir ChannelRect için:.?

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

Bu yavaş çıkışlar ana UI iş parçacığı Neden setValue bu LinearLayout tek görüntülenmesini etkiler olduğunu hepsi değil ... requestLayot() çizgi yavaşlamalar kaldırmak, ancak çıkarmadan ps ChannelRect büyüklüğü değil değişimler :(

+0

mesele bu kodla ilgili değildir – Blackbelt

+0

channelRect.setValue hiçbir ağır kodu (değer yoktur) veya channelRect.Animate() –

+0

içinde orada olduğunu hiç söylemedim. – Blackbelt

cevap

3

animasyon birçok (175+) özel görünümler içerir ChannelRect. Ana LinearLayout bir requestLayout() var donuyor nedeni requestLayout() üzerindeki her çocuğu yeniden güncellemeye çalışan çocuktan çağırmaya çalışıyorum

Ben geçersiz() yerine requestLayout() çağırarak şimdi iç görünüm dikdörtgen çizim ve benim ChannelRect değişti ediyorum:

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, Gerçekten sarstım;) – Snicolas