我正在学习如何使用asyncTask,我遇到了尝试实时显示TextView的问题。 mainActivity有几个按钮可以启动新活动,还有一个TextView,显示每200毫秒更改一次的值。但问题是TextView直到我点击按钮开始另一个活动才显示,当我按下“后退按钮”返回mainActivity时,值不会改变。但是,当我按下按钮开始另一个活动时,它会改变值。
private TextView t;
private int counter;
private boolean isUiVisible = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
t = (TextView) findViewById(R.id.counter);
counter = 0;
}
@Override
public void onStart(){
super.onStart();
isUiVisible = true;
new UpdateUi().execute();
}
@Override
public void onPause(){
super.onPause();
isUiVisible = false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class UpdateUi extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
while (true) {
if (isUiVisible) {
counter++;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
// Ensure the asynkTask ends when the activity ends
break;
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
t.setText(counter + "");
}
}
public void callRed(View view){
Intent intent = new Intent(this, RedActivity.class);
startActivity(intent);
}
public void callYellow(View view){
Intent intent = new Intent(this, YellowActivity.class);
startActivity(intent);
}
我在onProgressUpdate中尝试了setText,但它没有显示任何内容。我还搜索了其他是否有问题,但看起来他们确实有同样的问题(一个是onClickListener,这不是我想要的)。
答案 0 :(得分:0)
TextView
可能没有显示,因为它里面没有文字......如果没有查看layout.xml文件,就无法确定。
您有这种行为,因为变量isUiVisible
仅在调用onPause()
时变为false,即切换活动时。此时AsyncTask
退出doInBackground
方法并执行onPostExecute
,这会在TextView
中显示一些文字,使其显示。
要尝试修复您的代码,您应该在publihProgress()
内拨打doInBackground
,然后使用onProgressUpdate
更新UIThread中的TextView
。