2013-05-15 13 views
5

Próbowałem wielu sugestii, ale nic nie działa! Kiedy pracuje Thread.Sleep() nici tła, główny gwint również zamarza do tego czasu (animacja opuszczanej ramy) :(Android Thread.sleep() w AsyncTask zamrozić UI

Wariant 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); 
} 

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

I wypróbowałem to samo z post i Handler.To samo :(Kiedy przychodzi Thread.sleep (500) animacja zawiesza się :(

Co robię źle?

UPDATE 1

Znaleziony ciężki miejsce, które zwalnia wątku UI:

mam LinearLayout poziomą, która przechowuje 175 widoki ChannelRect. Kiedy zadzwonić animate (który rozpoczyna AlphaAnimation wszystko w porządku, ale kiedy setValue(), aby ChannelRect musi zmienić jego rozmiar:

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

Jest powolny upadki główny wątek UI Dlaczego setValue wpływa tylko jeden widok w tym LinearLayout.? nie wszyscy ... ps usuwania requestLayot() linia usunąć spowolnienie, ale nie zmienia rozmiar ChannelRect :(

+0

problem nie jest związany z tym kodem – Blackbelt

+0

nie ma ciężki kod w channelRect.setValue (wartość) lub w channelRect.Animate() –

+0

Nigdy nie powiedziałem, że tam był. – Blackbelt

Odpowiedz

3

powodem animacja zamarza to requestLayout() w ChannelRect. głównego LinearLayout że zawiera wiele (175+) widoki niestandardowe próbuje przerysować wszystkie dzieci na requestLayout() wywołane ze zaktualizowanego potomka

Ja zmieniłem ChannelRect do rysowania prostokąta wewnątrz widzenia i teraz dzwoni Invalidate() zamiast 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, Naprawdę się trzęsłem;) – Snicolas

Powiązane problemy