这是android中实现子线程的另外一个主要的方法,Handler是子线程消息管理着,位于主线程中,用来更新UI,Runnable中的run()函数是子线程,可以在运行过程中发送消息,通知Handler更新UI。下面直接上代码吧,注释还是比较详细的。
主要就是点击按钮,开启子线程,然后执行5次,退出。
public class ThreadStudy_HandleActivity extends Activity { /** Called when the activity is first created. */ private Button button; private MyHandle myHandler; // private MyThread myThread; //子线程 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button)findViewById(R.id.button1); button.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v){ myHandler = new MyHandle(); //初始化myHandler myThread = new MyThread(); //初始化myThread new Thread(myThread).start(); //启动子线程 } }); } //定义新线程类(子线程) class MyThread implements Runnable { public void run() { // Looper.prepare(); //创建本线程的消息循环队列并初始化 if (!Thread.currentThread().isInterrupted()) { //如果线程没有中断 for(int i=0;i<5;i++){ Message message = new Message(); //新建Message对象 Bundle bundle = new Bundle(); //新建数据传输对象 bundle.putString("Str", "线程运行"+i+"次"); //写入要传输的值 bundle.putInt("Value", i*10); message.setData(bundle); //与Message捆绑一起 ThreadStudy_HandleActivity.this.myHandler.sendMessage(message); //发送Message,由前边定义的handleMessage函数进行接收 try { Thread.sleep(5000); //休眠5000ms,模拟耗时操作 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } // Looper.loop(); //开始运行消息队列 } } //定义更新界面的操作,位于主线程 @SuppressLint("HandlerLeak") class MyHandle extends Handler{ //必须实现下函数,对子线程传输的数据进行处理 public void handleMessage(Message msg) { Bundle bundle = msg.getData(); //获取子线程传来的数据 String str = bundle.getString("Str"); int value = bundle.getInt("Value"); //显示 Toast.makeText(ThreadStudy_HandleActivity.this,"str:" + str + "\nvalue:" +value, Toast.LENGTH_SHORT).show(); super.handleMessage(msg); } }}
这个实现了基本的Handler与Runnable的配合,其中还有很多的应用方式,在接下来的总结中继续进行。
这里有两篇好文章,分享一下连接:
http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/