java - runOnUiThread 不起作用

标签 java android user-interface

这是我的第一个应用程序之一,我不知道我必须做什么。

package com.example.stopuhr;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public int hs, sek, min;
    public boolean running = false;
    public String mode = "gestoppt";


    public void setLabelText(){
        TextView textView1 = (TextView)findViewById(R.id.textView1);
        String ht = "";
        String st = "";
        String mt = "";

        if (hs<10){
            ht = "0" + hs;
        }else{
            ht = String.valueOf(hs);
        }

        if (sek<10){
            st = "0" + sek;
        }else{
            st = String.valueOf(sek);
        }

        if (min<10){
            mt = "0" + min;
        }else{
            mt = String.valueOf(min);
        }

        textView1.setText(mt + " : " + st + " : " + ht);
    }



    public void onClickStart (View view){
        Thread timer = new Thread(){

这是第一个错误 此行有多个标记 - 语法错误,插入“}”来完成ClassBody - 语法错误,插入“;”完成构造函数声明 - 语法错误,插入“;”完成 BlockStatements - 缺少方法的返回类型 - 语法错误,插入“)”来完成ConstructorDeclaration

            runOnUiThread(new Runnable() {

            public void run(){

                if (mode.equals("gestoppt")){
                    running = true;
                    mode = "läuft";

                    while (running){
                        try{Thread.sleep(9);}
                        catch(Exception e){}

                        if(hs<=99){
                            hs++;
                        }else{
                            hs = 0;
                            if(sek<=59){
                                sek++;
                            }else{
                                sek = 0;
                            }
                            if(min<=99){
                                min++;
                            }else{
                                min = 0;
                            }
                        }
                    }
                    setLabelText();
                }

            }

这是第二个错误: token “}”的语法错误,应为 MethodHeaderName 我不知道我与这个错误有什么关系。

            });

        };
        timer.start();


    }


    public void onClickStop (View view){
        if (mode.equals("läuft"));
        running = false;
        mode = "gestoppt";
    }

    public void onClickReset (View view){
        if(mode.equals("gestoppt")){
            hs = 0;
            sek = 0;
            min = 0;
            setLabelText();
        }
    }

}

感谢您的帮助。

最佳答案

在你的代码中你有:

public void onClickStart (View view){
    Thread timer = new Thread(){
        runOnUiThread(new Runnable() {
            public void run() {
                ...
            }
        });
    };
}

这里的问题是您在类中调用 runOnUiThread,而不是在方法中。一般来说,您似乎对线程、runnable 和 runOnUi 感到困惑。如果您随后想在 UI 线程上调用其 run 方法,则没有必要启动一个新线程。您需要在 UI 线程上做的唯一一件事就是更新标签文本。在不考虑您的逻辑的情况下,修复语法错误的一种方法是:

public void onClickStart (View view) {
    Thread timer = new Thread(){
        public void run() {
            ...
            runOnUiThread(new Runnable() {
                public void run() {
                    setLabelText();
                }
        }
    };
    timer.start();
}

最后,请注意,这不是执行此类逻辑的最佳方式。在我看来,带有 onProgressUpdateAsyncTask 是一个更好的解决方案。

关于java - runOnUiThread 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18316690/

相关文章:

java - 如何使用JSP页面中的参数来搜索Java类中的数据?

java - 如何替换数组的值?

java - 如何告诉 Eclipse 使用来自不同库的不同版本的包进行构建?

android - 在 Kotlin Multiplatform 上复制到剪贴板

java - 字体颜色的组合

java - Swing GUI 在数据处理期间不会更新

java - 该算法的时间复杂度是多少?

android - 如何以编程方式确定 Android 中当前 Activity 的 App

android - GreenDAO:存储其他实体中的实体列表

java - 如何在 Java 中锁定框架 (GUI)