Android runOnUiThread()不更新TextView

时间:2014-05-15 20:17:04

标签: android multithreading user-interface textview

所以我知道之前已经出现过这个问题,但我找不到代码出了什么问题。我有一个我想要更新的TextView和一个我想要隐藏的Button,所以我可以看到它正在工作。在我的onCreate中我有:

setMessage("Welcome, " + pref.getString("fName", "User"));

调用我创建的方法:

private void setMessage(final String input)
{
    this.input = input;
    runOnUiThread(new Runnable()
    {
    @Override
    public void run() {
            message.setText(input);
            create.setVisibility(4);
        }
    });
    Toast.makeText(this, input, Toast.LENGTH_LONG).show();
}

toast就是这样我才能看到字符串正确出现,而且确实如此。我没有崩溃,没有日志中的错误,没有。 Textview在我的Strings.xml中设置为一个字符串,表示" Hello World!"并且在活动开始后它会读取该消息,但该按钮仍然可见,并且出现在烤面包上的消息不会出现。我究竟做错了什么?顺便说一下,输入是一个字符串。

我的变数:

private TextView message;
private Button create;
private SharedPreferences pref;
private int norecurs = 0;
private Bundle state;
private Handler handler;
private String input;

我之前在onCreate()中的所有代码都没有:

pref = getSharedPreferences("login", 0);
    message = (TextView) findViewById(R.id.message);
    create = (Button) findViewById(R.id.button1);
    input = "Welcome, " + pref.getString("fName", "User");
    setMessage("Welcome, " + pref.getString("fName", "User"));

1 个答案:

答案 0 :(得分:0)

实际上,您似乎并不需要创建一个新线程。而不是:

pref = getSharedPreferences("login", 0);
message = (TextView) findViewById(R.id.message);
create = (Button) findViewById(R.id.button1);
input = "Welcome, " + pref.getString("fName", "User");
setMessage("Welcome, " + pref.getString("fName", "User"));

你应该写:

pref = getSharedPreferences("login", 0);
message = (TextView) findViewById(R.id.message);
create = (Button) findViewById(R.id.button1);
input = "Welcome, " + pref.getString("fName", "User");

// Just set the text in your onCreate
message.setText("Welcome, " + pref.getString("fName", "User"));

但是,如果您真的想保留setMessage方法,只需将其更改为:

private void setMessage(String input)
{
    this.input = input;

    message.setText(input);
    create.setVisibility(4);

    Toast.makeText(this, input, Toast.LENGTH_LONG).show();
}