web-dev-qa-db-ja.com

アニメーターは、ルーパースレッドでのみ実行できます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)
_

アプリは以前とまったく同じコードで正常に機能していましたが、現在はまったく機能しません。私は本当に混乱しています。

エラーが発生する場所は次のとおりです。

_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();
_

エラーはloading.animate()メソッドの概要を説明しています。

前もって感謝します!

27
Adrien Zier

Handlerを使用して、これに対してsolutionがあったと思います。 postDelayedを使用して、100そしてアニメーションタスクを実行します。あなたの場合は次のようになります:

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

今日、この問題が発生し、上記の作業で問題は解決しました。この方法に問題がある場合は、誰からも連絡をもらいたいです。

16
Guruprasad Rao

ルーパースレッド は、Android永続的にループする(またはキャンセルするまで)のスレッドです。これらは Handlers と連携して機能します。 Looperスレッドにメッセージを送信します。アニメーターは、繰り返しサイクルでアクションを実行するため、Looperスレッドを頻繁に使用します。

問題をさらに複雑にするために、おそらくViewオブジェクトでアニメーションを実行しています。これらはメインUIスレッドでのみ実行できます(これはたまたま最大のLooperスレッドです)。そのため、これらのアニメーションをあなたがしようとしているように別々のスレッドで実行することはできません。

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

UIスレッドでコードを実行する必要があります

12
Davide

エラーが発生し、ネットワーク操作を行う場所にコードを配置する

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

アクティビティでメインハンドラーインスタンスを作成し、ハンドルメッセージメソッドをオーバーライドできると思います。作業スレッドにハンドラーの引用を保存できます。作業が終了したら、ハンドラーを使用してメッセージを送信し、メッセージの処理メソッドでメッセージを受信できます。ハンドラメッセージメソッドなどからアニメーションを開始するには...

0
tuzhao