Android 使用AsyncTask中的永久循环不断更改视图
我试图通过在AsyncTask中编写一个永久循环来每秒更改textview,但这些应用程序没有成功运行,我不知道原因:Android 使用AsyncTask中的永久循环不断更改视图,android,android-asynctask,textview,Android,Android Asynctask,Textview,我试图通过在AsyncTask中编写一个永久循环来每秒更改textview,但这些应用程序没有成功运行,我不知道原因: private class BackGround extends AsyncTask <Void, Void, Void> { @Override protected Void doInBackground(Void...params) { while(true){ textview.setT
private class BackGround extends AsyncTask <Void, Void, Void> {
@Override
protected Void doInBackground(Void...params) {
while(true){
textview.setText("abc");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
textview.setText("def");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
私有类后台扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…params){
虽然(正确){
textview.setText(“abc”);
试一试{
睡眠(1000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
textview.setText(“def”);
试一试{
睡眠(1000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
}
它可以正常工作,直到线程完成第一次睡眠并尝试重置textview。您不能从
doInBackground
执行UI操作。您应该尝试在while循环中调用publishProgress(…)
,以进行UI更新。这将导致调用onProgressPublished
,您可以在其中实际进行更改
private class BackGround extends AsyncTask <Void, Void, Void> {
@Override
protected Void doInBackground(Void...params) {
while(true){
publishProgress( "abc" );
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
publishProgress( "def" );
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
protected void onProgressUpdate( String ...progress ){
textView.setText( progress[0] );
}
}
私有类后台扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…params){
虽然(正确){
出版进度(“abc”);
试一试{
睡眠(1000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
出版进度(“def”);
试一试{
睡眠(1000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
@凌驾
受保护的void onProgressUpdate(字符串…进度){
textView.setText(进度[0]);
}
}
通用参数应为AsyncTask
这是一个很好的建议,但此代码需要进一步改进。无休止的循环可能会造成内存泄漏。如果它是活动的内部类,那么它将持有对活动的引用,并且不允许从内存中清除活动。下一次启动活动将创建新的后台任务等。相反,while(true)应该是while(isCancelled),当活动被销毁时,对asynctask的引用应该是cancel。