从Android功能更新Textview

时间:2010-11-26 01:39:48

标签: java android multithreading eclipse textview

有人可以告诉我如何从一个函数更新控件Textview Android吗?我已深入搜索互联网并看到许多人提出同样的问题,我测试了线程但无法工作,有人有一个简单的工作示例吗?例如,调用一个函数(在循环中运行几次)并且函数在TextView中写入,但问题是在函数未完成运行之前,它会向我显示文本。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    while(condition) //here freezes the UI and the text in textview only shows when the loop ends
    {
        HardWork();  
    }

}

public void HardWork() {  

    txtProgreso.append("Test Line" + "\n\n");

};

提前致谢。

3 个答案:

答案 0 :(得分:5)

如果我理解正确的话 在这里使用AsyncTask,因此您可以在onProgressUpdate方法

中更新textview
private class SomeTask extends AsyncTask<String, String, String> {
    @Override
        protected String doInBackground(String... params) {
         while(condition) {
         //do more
         publishProgress("Some text value to you textview");
        }
         return null;
     }

     @Override
     protected void onProgressUpdate(String... values) {
         txtProgreso.append(values[0]);
     }


 }

答案 1 :(得分:3)

我认为你要问的是“我如何强制我的TextView显示其更新内容而不将控制权返回给runloop?” (即,退出你的职能)。

如果是这样,我担心你运气不好,这样的事情与Android的UI模型无关。最接近这一点的可能是跟踪你的循环状态,并设置一个定时器,它将调用一个函数来更新TextView。

这是一个例子。假设您要将文本“this is a test”放入TextView中,一次只能放一个字符:

private Handler mHandler = new Handler();
private String desiredText = new String("This is a test");

private Runnable mUpdateTextView = new Runnable() {
  public void run() {
    TextView textView = (TextView)findViewById(R.id.myTextView);
    int lengthSoFar = textView.getText().length();
    if (lengthSoFar < desiredText.length()) {
      mTextView.setText(desiredText.substring(0, lengthSoFar + 1));
      mHandler.postDelayed(100, mUpdateTextView);
    }
  }
};

protected void onStart() {
  mHandler.postDelayed(100, mUpdateTextView);
}

我认为我的一些对象可见性在这里是不正确的,并且我没有方便测试的Android环境,但是你得到了一般的想法。而不是处理程序,你也可以使用计时器,但它更重要,所以它取决于你想要更新UI的频率。

答案 2 :(得分:1)

通过执行以下操作即可获得textview。

TextView myTextView = (TextView)findViewById(R.id.textViewsId);

然后,您可以使用这些功能更改TextView。例如,您可以使用以下代码设置文本。

myTextView.setText("New text example");

您正在尝试执行的控件是否还有其他更新?