Android “只有创建视图层次结构的原始线程才能接触其视图。” for循环中的错误[重复]

Posted

技术标签:

【中文标题】Android “只有创建视图层次结构的原始线程才能接触其视图。” for循环中的错误[重复]【英文标题】:Android “Only the original thread that created a view hierarchy can touch its views.” error in for loop [duplicate] 【发布时间】:2016-12-09 03:55:58 【问题描述】:

我试图每半秒运行一次 for 循环。每次调用循环时,视图中都会发生一些变化,但这些变化是由另一个类(即 Speedometer)进行的。

Thread thread=new Thread()
        @Override
        public void run() 
            float i;
            try 

                for ( i = 0; i <= 100; i++) 
                            Speedometer1.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8);
                            Speedometer2.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8);
                            Speedometer3.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8);
                            Speedometer4.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8);
                            Speedometer5.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8);
                            Speedometer6.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8);


                    sleep(500);
                
            
            catch (InterruptedException e)
            e.printStackTrace();
        
    ;thread.start();

【问题讨论】:

参考android “Only the original thread that created a view hierarchy can touch its views.” 【参考方案1】:

那是因为任何视图只能在主线程或ui线程中修改。尝试使用runOnUiThread() 运行onSpeedChanged()。像这样:

    Thread thread=new Thread()
    @Override
    public void run() 
        float i;
        try 

            for ( i = 0; i <= 100; i++) 
                runOnUiThread(new Runnable() 
                    public void run() 
                        Speedometer1.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8);
                        Speedometer2.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8);
                        Speedometer3.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8);
                        Speedometer4.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8);
                        Speedometer5.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8);
                        Speedometer6.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8)

                    

                );


                sleep(500);
            
        
        catch (InterruptedException e)
        e.printStackTrace();
    
;thread.start();

【讨论】:

完美运行...非常感谢【参考方案2】:

你应该更新runOnUIThread中的UI组件。示例代码是

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

       //stuff that updates ui

    
);

【讨论】:

非常感谢,成功了!【参考方案3】:

您应该在 UI 线程上更新您的 UI。

为此,在您的 onCreate() 方法中创建一个处理程序:

private Handler mHandler;

@Override
public void onCreate() 
    mHandler = new Handler();
    // ...

然后在你的单独线程中调用处理程序在主线程上执行它:

mHandler.post(new Runnable() 
    @Override
    public void run() 
        // Update your UI
    
);

【讨论】:

【参考方案4】:

您不能从主线程外部修改View 对象。即使您的 Speedometer 类正在进行更改,它仍在您创建的辅助线程中运行。

您可以创建一个Runnable 并使用deejay 发布到由主线程创建的Handler,或者使用其他类似的技术来完成相同的操作。

【讨论】:

以上是关于Android “只有创建视图层次结构的原始线程才能接触其视图。” for循环中的错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录