Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓&x201C;只有创建视图层次结构的原始线程才能接触其视图;for循环中的错误_Java_Android_Multithreading - Fatal编程技术网

Java 安卓&x201C;只有创建视图层次结构的原始线程才能接触其视图;for循环中的错误

Java 安卓&x201C;只有创建视图层次结构的原始线程才能接触其视图;for循环中的错误,java,android,multithreading,Java,Android,Multithreading,我尝试每半秒钟运行一次for循环。每次调用该循环时,该循环都会更改视图中的某些内容,但这些更改是由另一个类(即速度计)进行的 Thread thread=new Thread(){ @Override public void run() { float i; try { for ( i = 0; i <= 100; i++) {

我尝试每半秒钟运行一次for循环。每次调用该循环时,该循环都会更改视图中的某些内容,但这些更改是由另一个类(即速度计)进行的

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();
Thread-Thread=新线程(){
@凌驾
公开募捐{
浮点数i;
试一试{

对于(i=0;i您应该在
runOnUIThread
中更新UI组件。示例代码为

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

       //stuff that updates ui

    }
});

这是因为任何视图只能在主线程或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();
Thread-Thread=新线程(){
@凌驾
公开募捐{
浮点数i;
试一试{

对于(i=0;i您不能从主线程外部修改
视图
对象。即使您的
速度表
类正在进行更改,它仍在您创建的次线程中运行


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

您应该在UI线程上更新UI

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

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

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

指的是完美的跑步…非常感谢Hanks,它成功了!
mHandler.post(new Runnable() {
    @Override
    public void run() {
        // Update your UI
    }
});