Android 使用AsyncTask中的永久循环不断更改视图

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

我试图通过在AsyncTask中编写一个永久循环来每秒更改textview,但这些应用程序没有成功运行,我不知道原因:

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。