Android中后台线程是无法直接更新UI程序的,这和Qt是一样的;
如果想要在线程中更新UI,一般有一下几个方法:
方法一:
在主线程中,继承重新Handler类,重写handleMessage函数,接受通过myHandler对象发送的消息;
Handler myHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: UpdateUIFunction(); break; } super.handleMessage(msg); } };
或者
通过java回调的方法构造Handler,获取消息;实质和上面的方法一样;
Handler(Handler.Callback callback);
方法二:
通过 Handler的post(Runnable r)函数,直接主线程中调用UI函数:
这个方法应用起来更简单一些;
Handler m_handlerThread = new Handler(); //注意:Handler的示例声明还是要放到接收消息的类中实现; 一般就是主线程(UI线程); public class thread_count extends Thread { int nCount = 0; @Override public void run() { while (true) { m_handlerThread.post(new Runnable() { @Override public void run() { textView.setText("thread UI: " + nCount++ ); } } ); try { sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } @Override public void onClick(View v) { new thread_count().start(); } 方法二.1; 如果想在工作线程中创建UI线程(主线程的Handler)那么需要:参数: Looper.getMainLooper())Handler handler = new Handler(Looper.getMainLooper()); 一般情况,new Handler不带参数的是获取当前线程的Looper; 更多信息可以百度; handler.post(new Runnable() { @Override public void run() { textview.show(); } });
方法三:更加简单一些:
主要通过View的post函数; 具体和Handler的post区别可以查询;
new Thread() { @Override public void run() { try { sleep(1000*10); } catch (InterruptedException e) { e.printStackTrace(); } mBluetoothAdapter.stopLeScan( LeScanCallback_fun ); textview.post(new Runnable() { @Override public void run() { textview.setText( "直接更新UI控件" ); } }); } }.start();