Eu estou acompanhando a aula, e como sempre (aposto que já aconteceu isso com vocês, quando eram iniciantes ), então eu fiz tudo certinho, mas quando executo, da uma exception, dizendo que
“Only the original thread that created a view hierarchy can touch its views.”. Mas eu fiz exatamente como o cara, e crasha quando termina a animação, e vai para o “some”. O crash é bem na linha dentro do run. Vejam:
package com.example.alfndega;
import androidx.annotation.ContentView;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
ImageView seta;
TextView texto;
Animation aparece, some;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aparece = new AlphaAnimation(0,1);
some = new AlphaAnimation(1,0);
some.setDuration(1000);
aparece.setDuration(500);
seta = findViewById(R.id.imgSeta);
seta.setVisibility(View.INVISIBLE);
texto = findViewById(R.id.lblTexto);
aparece.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
seta.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation) {
seta.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
some.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
seta.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation) {
seta.setVisibility(View.INVISIBLE);
texto.setText("Toque na tela para continuar...");
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
texto.setText("Toque na tela para continuar...");
}
public void tocouNaTela(View v) {
if(Math.random()>0.5){
seta.setScaleX(-1f);
texto.setText("Siga para a direita");
}else{
seta.setScaleX(1f);
texto.setText("Siga para a esquerda");
}
seta.startAnimation(aparece);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
seta.startAnimation(some);
}
},2000);
}
}
01-10 20:15:20.581 3960-3960/? D/dalvikvm: Late-enabling CheckJNI
01-10 20:15:20.641 3960-3966/? D/dalvikvm: Debugger has detached; object registry had 1 entries
01-10 20:15:21.321 3960-3960/? D/OpenGLRenderer: Enabling debug mode 0
01-10 20:15:24.611 3960-3982/com.example.alfndega W/dalvikvm: threadid=11: thread exiting with uncaught exception (group=0x41e51ba8)
01-10 20:15:24.621 3960-3982/com.example.alfndega E/AndroidRuntime: FATAL EXCEPTION: Timer-0
Process: com.example.alfndega, PID: 3960
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6177)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:865)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4320)
at android.view.View.invalidate(View.java:10940)
at android.view.View.startAnimation(View.java:16814)
at com.example.alfndega.MainActivity$3.run(MainActivity.java:92)
at java.util.Timer$TimerImpl.run(Timer.java:284)
01-10 20:17:07.471 3960-3982/com.example.alfndega I/Process: Sending signal. PID: 3960 SIG: 9