• 用Handler实现线程间的消息通信

    理解如何传递消息
    服务器君一共花费 18.672 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    在前面 Android Handler的一个简单使用例子 这一小节里,我们粗略介绍了如何使用 Handler。你也许会问,那个例子是在 Log 里输出结果的,能不能在界面上有所反应?

    当然是可以的。我们现在这个例子的目标就是,点击加载图片按钮,然后修改TextView的值,就当作是从网络回来的数据吧。

    之所以之前的那个例子做不到这样,是因为我们没办法在 Worker Thread 去修改 UI。修改 UI 必须在 UI Thread 进行的。那么怎么办呢?

    很简单,在 Worker Thread 用 Handler 发出一个消息进消息队列,然后在 主线程 里把这个消息取出来,那样就可以修改了。直接上代码了:

    private TextView ptv;
    private Button btn_next;
    
    private Handler pic_hdl;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	// TODO Auto-generated method stub
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.painting);
    	
    	ptv = (TextView)findViewById(R.id.ptv);
    	btn_next = (Button)findViewById(R.id.btn_loadnext);
    	
    	btn_next.setOnClickListener(new ButtonListener());
    	
    	pic_hdl = new PicHandler();
    }
    
    class ButtonListener implements OnClickListener{
    
    	@Override
    	public void onClick(View v) {
    		// TODO Auto-generated method stub
    		if( v.getId() == R.id.btn_loadnext){
    			Thread t = new LoadPicThread();
    			t.start();
    		}
    	}
    	
    }
    
    class LoadPicThread extends Thread{
    	@Override
    	public void run(){
    		try {
    			Thread.sleep(1 * 1000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		int rand = 1 + (int)(Math.random() * 9);
    		String s = "我是网上来的数据 " + rand + "号";
    		
    		Message msg = pic_hdl.obtainMessage();
    		msg.obj = s;
    		pic_hdl.sendMessage(msg);
    	}
    }
    
    class PicHandler extends Handler{
    
    	@Override
    	public void handleMessage(Message msg) {
    		// TODO Auto-generated method stub
    		String s = (String)msg.obj;
    		ptv.setText(s);
    	}
    	
    }
    

    代码也很简单,有 Android 基础的应该很容易看明白,这里就不多解释了。还是说几句吧,把这个流程走一遍:

    1. 点击按钮 btn_next,出发 ButtonListener 的 onClick 事件,启动 LoadPicThread 线程。
    2. LoadPicThread 线程先休眠 1 秒,然后通过 pic_hdl 这个 Handler,把数据装载到 msg 里面,然后通过 sendMessage 方法把数据发送到消息队列里。
    3. pic_hdl = new PicHandler(); pic_hdl 实例化之后,它是在 主线程 的,所以它可以修改 UI,在它的 handleMessage 方法里,直接把消息队列里的数据拿出来,然后就可以随心所欲地修改界面了。

    程序运行结果为:

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [PHP程序设计] PHP中的Hash算法 3 个条目
  2. [软件工程与项目管理] 呈现器的布局与绘制 11 个条目
  3. [PHP程序设计] PHP与函数式编程 1 个条目
  4. [Python程序设计] Python数据类型 11 个条目
  5. [PHP程序设计] 命令式编程范式 6 个条目
  6. [PHP程序设计] PHP扩展模块安装 1 个条目
  7. [智力开发与知识管理] 整体性学习步骤 9 个条目
  8. [数据库技术] 无限级分类数据表设计 4 个条目
  9. [软件工程与项目管理] 了解一点WebKit 9 个条目
  10. [Python程序设计] Tornado背景知识介绍 4 个条目
  11. [Python程序设计] 写几个简单的Tornado程序吧 5 个条目
  12. [PHP程序设计] PHP数组探索 4 个条目
窗口 -- [博客]