在Android中,如果希望从后台线程对UI进行循环更新,则会出现线程问题

在Android中,如果希望从后台线程对UI进行循环更新,则会出现线程问题,android,multithreading,Android,Multithreading,我试图在Android中以循环方式更新UI,但我得到一个错误,表明我在错误的线程上。我不明白为什么,因为我正在使用处理程序。有人有什么建议吗 TextView textView; protected Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); textView.setText((

我试图在Android中以循环方式更新UI,但我得到一个错误,表明我在错误的线程上。我不明白为什么,因为我正在使用处理程序。有人有什么建议吗

TextView textView;
protected Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        textView.setText((String)msg.obj);  
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_thread_sleep);
    textView=(TextView) findViewById(R.id.TextView1);
    init();
}

public void init()
{
    CounterThread counterThread=new CounterThread();
    counterThread.start();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_thread_sleep, menu);
    return true;
}

class CounterThread extends Thread {

    @Override
    public void run() {
        super.run();
        int counter=0;

        handleString("in Thread handler");
        try{Thread.sleep(2000); }catch(Exception e){Log.d("Exception", e.toString());}

        while(counter<10)
        {
            counter++;
            String counterString=String.valueOf(counter);
            handleString(counterString);

            try{Thread.sleep(2000); }catch(Exception e){Log.d("Exception", e.toString());}
        }//while
    }//run 

    public void handleString(String string)
    {
        Message msg=handler.obtainMessage();
        msg.obj="counter"+" "+string;
        handler.handleMessage(msg);
    }

}//thread
TextView TextView;
受保护的处理程序=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
超级handleMessage(msg);
textView.setText((字符串)msg.obj);
}
};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u thread\u sleep);
textView=(textView)findViewById(R.id.TextView1);
init();
}
公共void init()
{
反螺纹反螺纹=新反螺纹();
counterThread.start();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.activity\u thread\u sleep,menu);
返回true;
}
类CounterThread扩展线程{
@凌驾
公开募捐{
super.run();
int计数器=0;
手柄环(“螺纹处理器”);
试试{Thread.sleep(2000);}catch(异常e){Log.d(“异常”,e.toString());}

(counter您错误地调用了
处理程序
。从后台线程调用
处理程序.sendMessage()
将消息发布到队列中。这将在
处理程序
上调用
handleMessage()
方法处理消息


另外,如果只使用后台线程在再次更新UI之前等待一定时间,那么可以考虑使用
sendMessageDelayed()
相反。
处理程序
能够自行计时,而无需创建第二个
线程

因为您没有在UI线程上执行代码。因此,您应该使用runOnUiThread:)

所以,是这样的:

protected Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        final String msgString = (String)msg.obj;
        runOnUiThread(new Runnable() {
            @Override
            void run() {
                textView.setText(msgString);
            }
        });
    }
};

仅供参考,您以这种方式解决了
处理程序
的问题,完全违背了使用它的目的。
处理程序
的目的是让它在主线程上为您执行代码,但您必须先适当地调用它来传递消息。