2013-05-15 33 views
5

Tôi đã thử nhiều đề xuất nhưng không có gì hoạt động! Khi tôi gọi Thread.sleep() trong sợi nền, chủ đề chính cũng đóng băng cho thời gian (khung thả Animation) này :(Android Thread.sleep() trong AsyncTask đóng băng UI

Phiên bản 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); 
} 

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

Và tôi đã thử điều tương tự với bài viết và xử lý Cùng một điều :(Khi Thread.sleep (500) đến hoạt hình đóng băng: (

Tôi đang làm gì sai?

CẬP NHẬT 1

Tìm thấy nơi nặng làm chậm thread UI:

Tôi có LinearLayout ngang mà các cửa hàng 175 lần xem ChannelRect. Khi tôi gọi animate (bắt đầu AlphaAnimation tất cả okay, nhưng khi tôi SetValue() để ChannelRect nó phải thay đổi kích thước của mình:

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

Đây là nguyên nhân gây chậm chính thread UI Tại sao setValue chỉ ảnh hưởng đến một cái nhìn trong LinearLayout này.? không phải tất cả ... ps loại bỏ requestLayot() dòng loại bỏ chậm nhưng kích thước ChannelRect không thay đổi :(

+0

vấn đề không liên quan với mã này – Blackbelt

+0

không có mã nặng trong channelRect.setValue (giá trị) hoặc trong channelRect.Animate() –

+0

Tôi chưa bao giờ nói nó ở đó. – Blackbelt

Trả lời

3

lý do tại sao hình ảnh động đóng băng đó là một requestLayout() trong chính LinearLayout ChannelRect. có chứa nhiều (175) quan điểm tùy chỉnh cố vẽ lại mọi trẻ em trên requestLayout() được gọi từ trẻ được cập nhật.

Tôi đang thay đổi ChannelRect tôi để vẽ hình chữ nhật bên trong cái nhìn và bây giờ kêu gọi làm mất hiệu lực() thay vì 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, Tôi thực sự shaked;) – Snicolas

Các vấn đề liên quan