初识安卓之利用Handler进行线程间数据传递

摘要:
背景:单击界面上的按钮,在文本框中的数字上添加1。在此过程中,如果按钮单击事件启动一个新线程,向文本框中的文本添加1,则计算结果将无法返回到主线程。主线程无法获取修改的值,也无法更新文本框的内容。请使用处理程序在线程之间传输数据。以下是DEMOPublicclassPostActivityActivityextendsActivity{privateTextViewnumTV;int

背景:点击界面上一个按钮,使文本框中的数字加1,此过程中,如果按钮点击事件是开启了一个新的线程,让文本框中的文字加1,则运算后的结果无法返回到主线程中,主线程拿不到修改后的值,无法更新文本框的内容,这时,使用Handler来进行线程间的数据传递

以下为DEMO

public class PostActivityActivity extends Activity {
    private TextView numTV;
    int num;
    //负责线程间的通信,解决新线程修改了数据,但操作不到主线程里去更新的问题
    private Handler handler=new Handler(){
        //msg是从按钮监听线程传过来的,是一个不断变化值的最新值,主线程在这里等待获取
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            if(msg.what==1){
                //传来的数据是被设置了类型的,所以要区分着拿
                int num=msg.getData().getInt("num");
                numTV.setText(num+"");                
            }
        }        
    };
    /** Called when the activity is first created. */
    @Override
  //handler通信方式一:
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        numTV = (TextView) findViewById(R.id.numTV);
    }
    public void add1(View view){
        new Thread(){
            public void run(){    
                //在新线程里发送一个runnable对象,则主线程就会执行该对象的run方法
       疑问:运算过程还是在主线程中进行的,如何提高效率,等于白做???
                handler.post(new Runnable() {                    
                    @Override
                    public void run() { 
                 //疑问:没有msg了怎么区分消息类型???
                        // TODO Auto-generated method stub
                        //只有创建numTV的线程才能操作numTV
                        numTV.setText(++num+"");                        
                    }
                });
            }            
        }.start();
    }
  //handler通信方式二:开启新的线程来执行按钮上的监听方法,可以提高效率,解耦
    public void add2(View view){
        new Thread(){
            public void run(){
            //创建一个消息对象,该对象内部有一个存放数据的map集合
            Message msg=new Message();
            //通过消息对象.getData的形式,可以拿到对象内部的map集合,并可以放入一些数据
            msg.getData().putInt("num", ++num);   
            //把最新的数据通过handler发给创建handler的线程的线程,
            //那个线程就会自动执行handler类的handlerMessage方法
             
            //发消息之前还可以给msg指定类型,以便在主线程中获取时可以区分的拿到消息
            msg.what=1;
            handler.sendMessage(msg);
        }        
    }.start();
  }
}

免责声明:文章转载自《初识安卓之利用Handler进行线程间数据传递》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DotnetBrowser入门教程-(1)浏览器控件使用C# 通过反射实现复杂对象的深拷贝(附源码)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux-pthread如何设置线程的优先级

设置线程优先级的函数: int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param) 它主要用于设置线程的调用策略和优先级。 参数说明: 1.  target_thread是使用pthread_create所获得的线程ID。  ...

Java学习-074-多线程07:后台线程 Thread.setDaemon(true)

Java 程序中,只要前台存在一个线程,则 Java 进程(程序)都不会消失。在前台线程存续期间,可以设置一个后台线程,线程设置为后台线程可通过 Thread.setDaemon(true) 实现。示例代码如下所示: packagecom.fanfengping.demo; importlombok.extern.slf4j.Slf4j; /*** J...

notify()和notifyAll()有什么区别?

先解释两个概念。 等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁。 锁池:只有获取了对象的锁,线程才能执行对象的 synchronized 代码,对象的锁每次只有一个线程可以获得,其他线程只能在锁池中等待 区别: notify() 方法随机唤醒对象的等待池中...

python——多线程与线程锁

一、概念: 进程:对系统过来说,一个任务是一个进程; 线程:线程是包含在进程中。进程中,线程来工作,线程是最小的单位。一个进程可以启多个线程 二、进程和线程使用时的选择: 1.cpu密集型任务,用进程 #比如排序、计算的功能2.IO密集型任务,多线程 input Output #读写频繁,网络IO或者磁盘IO。浪费CPU比较少的用多线程3.如果需要读写也需...

Qt跨线程调用错误解析及解决办法

错误提示:Error: Cannot create children for a parent that is in a different thread. 错误案例分析 新建SerialLink子线程,继承QThread,并重写它的run(),调用 start()函数时自动调用重载的run()函数。在主线程中创建SerialLink类的对象。 串口_po...

线程池阻塞队列之LinkedBlockingQueue

LinkedBlockingQueue介绍 LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。 此外,LinkedBlockingQueue可以指定队列的容量。如果不指定,默认容量大小等于Integer.MAX_VALUE。 LinkedBloc...