0

在我的应用程序中,我需要根据来自网络的数据更新 UI 中的文本。为此,我使用 aAsyncTask在 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通过调用方法使用 () 方法更新 UI 上的文本publishProgress吗?任何建议。

4

3 回答 3

10

像这样将您的 Ui 方法放在 runonUiTHREAD 中

runOnUiThread(new Runnable() {
public void run() {
    tv.setText("ABC");
}
 });
于 2012-05-04T14:08:17.927 回答
7

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

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

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

它发布 runnable 以在 UI 线程上运行。

于 2012-05-04T14:07:54.167 回答
4

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

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

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

于 2012-05-04T14:08:08.567 回答