2013-05-15 54 views
5

我試了很多建議,但沒有任何作品!當我在後臺線程中調用Thread.sleep()方法,主線程還用於凍結此時(動畫幀丟棄):(Android Thread.sleep()在AsyncTask凍結UI

版本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); 
} 

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

同樣的事情:(當Thread.sleep(500)到達動畫凍結:(

我做錯了什麼?

更新減慢UI線程1

找到重的地方:

我有一個存儲175個ChannelRect意見水平的LinearLayout。當我打電話動畫(啓動AlphaAnimation一切還好,但是當我SETVALUE()來ChannelRect就必須改變自己的尺寸:

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

這是緩慢起伏主UI線程爲什麼setValue方法會影響這個LinearLayout中只有一個看法?不是所有的... PS去除requestLayot()行刪除放緩,但ChannelRect大小沒有變化:(

+0

問題沒有與此相關的代碼 – Blackbelt

+0

存在channelRect.setValue無重碼(價值)或在channelRect.Animate() –

+0

我從來沒有說過它在那裏。 – Blackbelt

回答

3

爲什麼動畫凍結它包含許多(175+)自定義視圖一個requestLayout()在ChannelRect。 主要的LinearLayout原因試圖通過requestLayout()從更新後的子項調用來重繪每個子項。

我改變了我的ChannelRect繪製內部視圖矩形現在調用Invalidate(),而不是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,我真的很震動;) – Snicolas