java - 在非 UI 线程中编辑按钮的颜色 (Android)

标签 java multithreading android

我见过一些类似的问题并获得了一些信息,但他们并没有羞于告诉我足以让它发挥作用的信息。

我想做的是制作一个简单的节奏游戏,玩家定期点击按钮(即节拍)。我想设置一种通过让按钮改变颜色来指示何时点击的方法,并且由于这将是定期重复的任务,所以我想使用带有计划方法的计时器对象。

但是当我尝试调用此方法时,它告诉我无法在非 UI 线程中更改 UI。我尝试了几种方法在主线程中编写一个可以从计时器对象调用的方法,但每次都会遇到相同的错误。我假设我只是对 UI 线程中的内容有错误的想法,所以我希望有人能够澄清它。

这是我尝试的一种方法的 fragment ,只是为了展示我的代码的样子:

OnClickListener clickButton = new View.OnClickListener() {
public void onClick(View v) {
    if (startBeat == 0){
        startBeat = System.nanoTime();
        timerStart.scheduleAtFixedRate((new TimerTask()
        {
            public void run()
            {
                flashButton();
            }
        }), 0, beatTime);               
        timerEnd.schedule(new TimerTask()
        {
            public void run()
            {
                unflashButton();
            }
        }, beatTolerance*2, beatTime);              
        return;
    }
};

public void flashButton(){
    beatPrompt.setBackgroundColor(getResources().getColor(R.color.primary1transparent_very));
}
public void unflashButton(){
    beatPrompt.setBackgroundColor(getResources().getColor(R.color.primary1));
}

需要明确的是,这全部包含在我的 MainActivity 类以及 OnCreate 类中。

最佳答案

如果你在一个 Activity 中,你需要做的就是使用 runOnUiThread(),然后放置代码来更改 ui 元素

public void flashButton(){
    runOnUiThread(new Runnable() {
            @Override
            public void run() {
                beatPrompt.setBackgroundColor(getResources().getColor(R.color.primary1transparent_very));
            }
        });
}

关于java - 在非 UI 线程中编辑按钮的颜色 (Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27549763/

相关文章:

java - codenameone 中的替代方法

java - 带 BaseAdapter 的 ListView

java - 如何获取 List<JSONObject> 中的每个元素 json = new ArrayList<JSONObject>()

c++ - 将数组传递给线程

java - 使用文件类循环输入文件

c# - 递归和 Rx 并行性

java - 当线程完成/完成时在 Swing 中获取通知

java - 自定义微调器适配器中未显示图像显示

java - Android Room - 处理对象中的对象列表和查询结果

java - 添加 URL.openStream 使用的证书