如何从Android中的后台线程更新UI中的文本

时间:2012-05-04 14:01:32

标签: android android-asynctask

在我的应用程序中,我需要根据来自网络的数据更新UI中的文本。为此我使用AsyncTask在Android中的后台工作。我的代码如下。

public class DefaultActivity extends Activity{

  TextView textView;
  public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    textView=(TextView)findViewById(R.id.textId);
    new networkFileAccess().execute("background","Progress","result");
  }

  private class networkFileAccess extends AsyncTask<String,String,String>{

    protected String doInBackground(String... background){
       return changeText();
    }

    private String changeText(){
     //Code to Access data from the Network.
     //Parsing the data.
     //Retrieving the boolean Value.
     if(booleanistrue){
      //Displaying some text on the UI.
      publishProgress("someTextOnUI");
      //Send request till we get get boolean value as false.
      changeText();
     }else{
       return "success";
     }
      return "";
    }

    protected void onProgressUpdate(String... progress){
      textView.setText("Wait background work is going on");
    }

    protected void onPostExecute(String result){
      if(result.equals("success")){
       //Code to finish the activity.
      }
    }
  }

}

在上面的代码中,我能够运行后台线程,直到我得到布尔值为false。但是文本没有在UI上更新。我是否可以使用onProgressUpdate()方法通过调用publishProgress方法来更新UI上的文本。?任何suggesstions。

3 个答案:

答案 0 :(得分:10)

将你的Ui方法放在runonUiTHREAD中,就像这样

runOnUiThread(new Runnable() {
public void run() {
    tv.setText("ABC");
}
 });

答案 1 :(得分:7)

在AsyncTask中,onPostExecute()和onPreExecute()都在UI线程上运行。因此,您可以更改onPostExecute()方法中的文本。

或者你也可以在线程中运行的doInBackground()方法中调用runOnUiThread:

runOnUiThread(new Runnable() {
    public void run() {
        // change text
    }
});

它可以在UI线程上运行runnable。

答案 2 :(得分:4)

我想简短的回答是,是的,您可以更新onProgressUpdate方法中的UI元素。 OnProgressUpdate实际上是在UI线程本身上调用的,因此您不需要做任何花哨的事情。

如果你的onProgressUpdate被硬编码为“等待后台工作正在进行”,你怎么知道你的onProgressUpdate无效?

此外,您是否有任何理由不使用ProgressDialog向用户显示“等待后台工作正在进行”消息?如果您真的希望他们等待,通常会更直观。它显示一个微调器或进度条(您的选择),让他们知道正在完成的工作。在你的应用程序处理完所有内容之前,它还可以防止它们执行其他操作。