在前面 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 基础的应该很容易看明白,这里就不多解释了。还是说几句吧,把这个流程走一遍:
程序运行结果为:
现代魔法 推荐于 2013-02-27 10:23