更新Android UI以显示正在生成的随机数?

时间:2014-09-25 17:57:02

标签: java android user-interface random

我已经设置了一个名为ButtonRoll的onClick方法的按钮,该方法从1-100开始随机生成一个数字,然后在文本视图中显示按钮下方的输出。这很好,但我想要进行的是能够循环生成20个数字。我尝试了以下内容,但它只显示生成的最后一个数字。我猜这是因为UI没有被更新,直到生成最后一个数字。

public void ButtonRoll(View view) {

        int n;
        Random rand = new Random();
        TextView textRoll = (TextView) findViewById(R.id.textview_roll);
        for (int i=0; i<20; i++){
            try {
                Thread.sleep(200);
                n = rand.nextInt(100) + 1;
                String roll = String.valueOf(n);
                textRoll.setText("Random number is " + roll);
            } catch (InterruptedException e) {
                e.printStackTrace();
        }
    }

我是否必须使用处理程序?还是有一个更简单的解决方案? 谢谢你的时间。

3 个答案:

答案 0 :(得分:0)

您可以使用handler概念:

有多种方法可以更新UI并修改TextView线程外部的UI等视图。 Handler只是一种方法。

以下示例允许单个Handler响应各种类型的请求。

private final static int DO_UPDATE_TEXT = 0;
private final static int DO_THAT = 1;
private final Handler myHandler = new Handler() {
    public void handleMessage(Message msg) {
        final int what = msg.what;
        switch(what) {
        case DO_UPDATE_TEXT: doUpdate(); break;
        case DO_THAT: doThat(); break;
        }
    }
};

更新您的某个功能中的UI,现在位于UI主题:

private void doUpdate() {
    myTextView.setText("updating..");
}

asynchronous任务中,向Handler发送消息。有几种方法可以做到这一点。这可能是最简单的:

myHandler.sendEmptyMessage(DO_UPDATE_TEXT);

答案 1 :(得分:0)

试一试。

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:gravity="center">

    <Button android:id="@+id/button_roll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:text="Roll"/>

   <TextView android:id="@+id/textview_roll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button_roll" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity implements OnClickListener
{
    private class Roller implements Runnable
    {
        private int numTimes;
        private long delayMillis;

        public Roller(int numTimes, long delayMillis)
        {
            this.numTimes = numTimes;
            this.delayMillis = delayMillis;
        }

        @Override
        public void run() 
        {
            if (textRoll != null)
            {
                int n = rand.nextInt(100) + 1;
                String roll = String.valueOf(n);
                textRoll.setText("Random number is " + roll);

                numTimes--;

                if (numTimes > 0)
                {
                    textRoll.postDelayed(this, delayMillis);
                }
            }
        }
    }

    private TextView textRoll;
    private Random rand = new Random();

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button_roll).setOnClickListener(this);
        textRoll = (TextView)findViewById(R.id.textview_roll);
    }

    @Override
    public void onDestroy()
    {
        findViewById(R.id.button_roll).setOnClickListener(null);
        textRoll = null;
        super.onDestroy();
    }

    @Override
    public void onClick(View v)
    {
        int id = v.getId();

        if (id == R.id.button_roll)
        {
            findViewById(R.id.textview_roll).post(new Roller(20, 100));
        }
    }
}

答案 2 :(得分:0)

在注意到之前提到的.post方法之后,我有一个游戏,并想出了这个版本也是如此。你能看出为什么以这种方式运行它是不可取的?

public void ButtonRoll(View view) {
        new  Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i<50;i++) {
                    try {
                         Thread.sleep(50);
                         final TextView textRoll = (TextView) findViewById(R.id.textview_roll);
                         int n;
                         Random rand = new Random();
                         n = rand.nextInt(100) + 1;
                         final String roll = String.valueOf(n);
                         textRoll.post(new Runnable() {
                              @Override
                              public void run() {
                                    textRoll.setText("Random number is " + roll);
                              }
                         });
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }