android - 关于重新启用 ToggleButton 的奇怪错误

标签 android

我有一个非常奇怪的问题, 我尝试禁用切换按钮一秒钟,以防止我的应用程序中的用户对其进行垃圾点击。

我的切换按钮有这个监听器:

videoToggleListener = new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                switchVideoSource();
                switchBetweenSources.setEnabled(false);

                freezeToggle.schedule(new TimerTask(){

                    @Override
                    public void run() {

                        switchBetweenSources.setEnabled(false);
                        switchBetweenSources.setEnabled(true);

                    }

                }, 1000);


            }
        };

我的应用程序不会强制关闭 setEnabled(false),但会强制关闭 setEnabled(true)。

有什么想法吗?

我的日志猫:

02-10 13:45:30.500: E/AndroidRuntime(7285): FATAL EXCEPTION: Timer-0
02-10 13:45:30.500: E/AndroidRuntime(7285): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.view.View.invalidate(View.java:5255)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.widget.TextView.invalidateDrawable(TextView.java:3916)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.graphics.drawable.LayerDrawable.invalidateDrawable(LayerDrawable.java:298)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:300)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:227)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:99)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.graphics.drawable.Drawable.setState(Drawable.java:400)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.graphics.drawable.LayerDrawable.onStateChange(LayerDrawable.java:409)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.graphics.drawable.Drawable.setState(Drawable.java:400)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.view.View.drawableStateChanged(View.java:7374)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.widget.TextView.drawableStateChanged(TextView.java:2312)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.widget.CompoundButton.drawableStateChanged(CompoundButton.java:265)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.widget.ToggleButton.drawableStateChanged(ToggleButton.java:143)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.view.View.refreshDrawableState(View.java:7388)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at android.view.View.setEnabled(View.java:3147)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at fr.partisocialiste.psa.activity.VideosGridActivity$1$1.run(VideosGridActivity.java:101)
02-10 13:45:30.500: E/AndroidRuntime(7285):     at java.util.Timer$TimerImpl.run(Timer.java:284)
02-10 13:45:32.804: I/Process(7285): Sending signal. PID: 7285 SIG: 9

编辑:

我已经这样改变了我的听众:

videoToggleListener = new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                switchVideoSource();
                switchBetweenSources.setEnabled(false);

                freezeToggle.schedule(new TimerTask(){

                    @Override
                    public void run() {
                        runOnUiThread(new Runnable(){

                            @Override
                            public void run() {
                                switchBetweenSources.setEnabled(true);

                            }                               
                        });                         
                    }                   
                }, 2000);
            }
        };

谢谢大家,你们太棒了=)!

最佳答案

显然,问题在于您尝试从非 UI 线程更改 View。如果您说您在 TimerTask 内的第一行没有遇到此异常,而只是在第二行中遇到此异常,这可能是因为您的 ToggleButton 已被禁用,并且这不会改变View

要从 UI 线程以外的其他 Thread 更改 View 的状态,您应该使用 runOnUiThread()

关于android - 关于重新启用 ToggleButton 的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9228098/

相关文章:

java - 如何比较 3 个 ArrayList 并获取 3 个新 ArrayList 中的差异?

android - 我应该如何为自定义相机设置曝光和白平衡值

android - 如何更改相机预览回调缓冲区的方向?

java - 用户登录后,我应该使用类实例(序列化)还是单例来存储 userInfo

Android WebView 请求焦点 : How to prevent scrolling to top?

android - 如何在 Android 中以编程方式打开和关闭切换按钮?

java - 来自资源的 Android RandomAccessFile 使用

java - 我的 BluetoothCommandService 中的 NullPointerException

android - 有没有办法在模拟器中运行玻璃器皿?

android - 如何在 Android 中使用单独的类获取当前位置