在我的应用程序中,我需要根据来自网络的数据更新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。
答案 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向用户显示“等待后台工作正在进行”消息?如果您真的希望他们等待,通常会更直观。它显示一个微调器或进度条(您的选择),让他们知道正在完成的工作。在你的应用程序处理完所有内容之前,它还可以防止它们执行其他操作。