【问题标题】:Android - Using Async to update UIAndroid - 使用异步更新 UI
【发布时间】:2014-02-16 23:43:06
【问题描述】:

我对如何使用 Async 感到困惑。我希望它在单击按钮后立即更新 UI,而不必终止活动并重新实例化它。在后台,我希望它等待单击以更新 UI,并在单击后确定是否单击了正确的按钮。我正在使用布尔 isUserRight();确定答案是否正确,然后我使用 resetButtons();重置按钮(显然)然后 setButtons();更改按钮。我把方法都写出来了,我只是不知道如何将它们实现到异步中。我需要立即更新 UI 以更改按钮的颜色。我不需要任何方法、按钮颜色等方面的帮助,只需要 Async,我也没有要求任何人给我喂食,只要稍微推动我去哪里。任何帮助都会很好,谢谢大家!

TL;DR 需要在使用异步推送按钮后更新 UI,这样按钮颜色就不会卡住,我也不必重新启动 Activity 来更新 UI。我不需要完整的代码,只需要一些关于去哪里的指导。

编辑:添加了一些代码。

这是在我的 onCreate();

buttons[0] = (Button)findViewById(R.id.b0);
    buttons[1] = (Button)findViewById(R.id.b1);
    buttons[2] = (Button)findViewById(R.id.b2);
    buttons[3] = (Button)findViewById(R.id.b3);
    buttons[0].setOnClickListener(this);
    buttons[1].setOnClickListener(this);
    buttons[2].setOnClickListener(this);
    buttons[3].setOnClickListener(this);

然后在我的 onClick 下,我有一个用于所有按钮的开关:

    public boolean isUserRight() {
        if(correct == 1) {
              onButton();
            return true;
            //Toast.makeText(getApplicationContext(), "Good job!", Toast.LENGTH_SHORT).show();
            //buttons[test].getBackground().setColorFilter(Color.GREEN, PorterDuff.Mode.MULTIPLY);
        }
        onButton();
        return false;
    }


    public void onButton() {
        int rnd = new Random().nextInt(buttons.length);
        test = rnd;
        buttons[rnd].getBackground().setColorFilter(Color.YELLOW, PorterDuff.Mode.MULTIPLY);
        //ResetButtons();
    }

这很好用,唯一的问题是在单击第一个按钮后,颜色停止变化并得到更新。

【问题讨论】:

  • 如果我理解正确,你不应该使用 Async 来做你想做的事。如果您在问题中添加一些代码,这将很有用。无论如何,您是否在按钮上设置了 OnClickedListener,您是否在其中更新 UI?
  • 是的,我在按钮上放了一个监听器。我的问题是我更改了按钮的颜色,但 UI 没有更新,所以按钮颜色保持之前的颜色,直到你点击另一个按钮,基本上它落后了一步。我只需要一些东西来立即刷新 UI,这样颜色就会立即改变。
  • 发布代码“是的,我在按钮上放置了一个监听器。我的问题是我更改了按钮的颜色,但 UI 没有更新”。因为刘是对的。你一定是做错了什么,或者有些事情你没有告诉我们。在您发布代码之前,我们不会知道实际发生了什么。将 AsyncTask 用于类似的事情是矫枉过正的。应该不需要它。
  • @StephanBranczyk 你去。用一些代码更新了帖子,希望这会有所帮助。

标签: android


【解决方案1】:
void test(){
    final Handler mHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            if(msg.what == 0){
                // update your ui

            }

        }

    };

    new Thread(new Runnable() {
        public void run() {
            // do network job
            // do something you want here
            mHandler.sendEmptyMessage(0);
        }
    }).start();

}

【讨论】:

    【解决方案2】:

    好的,我修好了。感谢您的所有帮助,感谢任何想知道我如何修复它的人,我正在使用 view.invalidate,它没有针对任何东西,所以我不得不将其更改为按钮数组 ex。:

    按钮[1].invalidate();这将刷新按钮而不是整个活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      相关资源
      最近更新 更多