2016-06-07 33 views
13

Sto tentando di animare qualcosa quando un'attività è completata. Il problema qui è ricevo questo messaggio di errore:Gli animatori possono essere eseguiti solo sui thread Looper Android

android.util.AndroidRuntimeException: Animators may only be run on Looper threads 
    at android.animation.ValueAnimator.cancel(ValueAnimator.java:1004) 
    at android.view.ViewPropertyAnimator.animatePropertyBy(ViewPropertyAnimator.java:965) 
    at android.view.ViewPropertyAnimator.animateProperty(ViewPropertyAnimator.java:921) 
    at android.view.ViewPropertyAnimator.alpha(ViewPropertyAnimator.java:735) 
    at com.design.zaton.prototypei.MainActivity$1$1.run(MainActivity.java:93) 
    at java.lang.Thread.run(Thread.java:761) 

L'applicazione ha funzionato bene, prima con lo stesso codice esatto, ma ora non si limita. Sono veramente confuso.

Ecco dove l'errore si verifica:

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     final String s = getGiphyViews(String.valueOf(mEdit.getText())); 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       result.setText(s); 
      } 
     }); 

     loading.animate() 
       .alpha(0) 
       .setDuration(100); 

     done.animate() 
       .scaleY(1) 
       .scaleX(1) 
       .setDuration(300); 
    } 
}).start(); 

L'errore delinea il metodo loading.animate().

Grazie in anticipo!

risposta

7

penso, c'è stato un solution per questo utilizzo Handler. È possibile utilizzare postDelayed come minimo come 100 ed eseguire le attività di animazione. Nel tuo caso sarebbe:

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     final String s = getGiphyViews(String.valueOf(mEdit.getText())); 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       result.setText(s); 
      } 
     }); 

     loading.animate() 
       .alpha(0) 
       .setDuration(100); 

     done.animate() 
       .scaleY(1) 
       .scaleX(1) 
       .setDuration(300); 
    } 
}, 100); 

Ho avuto questo problema oggi e soprattutto il lavoro ha risolto il problema. Mi piacerebbe sentire qualcuno se c'è qualche problema con questo metodo.

+1

Grazie fratello, è così utile !!! –

+0

@RasoolMohamed .. Anytime bro ... Happy Coding .. :) –

+0

Grazie, funziona davvero! – NickitaX

14

Looper threads sono thread in Android che si collegano in modo permanente (o finché non li annulli). Funzionano in combinazione con Handlers che invierà e invierà messaggi ai thread Looper. Gli animatori usano pesantemente i fili Looper perché eseguono le loro azioni in cicli ripetuti. Ciò consente all'animatore di non bloccarsi dopo aver premuto "start" in modo da poter continuare a eseguire altre azioni.

Per complicare ulteriormente le cose, è molto probabile che eseguiate animazioni su oggetti View. Questi possono essere eseguiti solo sul thread dell'interfaccia utente principale (che è il più grande thread di tutti gli Looper). Quindi, non è possibile eseguire queste animazioni su thread separati come si sta tentando.

+0

Grazie molto per la spiegazione chiara. –

0

Penso che sia possibile creare un'istanza di gestore principale nell'attività e sovrascrivere il metodo di gestione dei messaggi. è possibile salvare una citazione del gestore nel proprio thread di lavoro. Al termine del lavoro è possibile utilizzare il gestore per inviare un messaggio e si riceve il messaggio nel metodo di gestione dei messaggi. Per avviare l'animazione dal metodo di gestore dei messaggi e così via ...

+0

Sì, questo è quello che ho fatto e funziona bene –

1

Codice Put Dove sono sempre errori e facendo tutte le operazioni di rete

new Handler().post(new Runnable() { 
     @Override 
     public void run() { 
      // add your code here 
     } 
    }); 
+2

Puoi aggiungere una piccola spiegazione su come utilizzare il tuo snippet di codice? – talex

4
runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       //Your code 
      } 
}); 

Devi eseguire il codice nel thread UI