我已经设置了一个名为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();
}
}
我是否必须使用处理程序?还是有一个更简单的解决方案? 谢谢你的时间。
答案 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();
}