Handler的用法

来源:互联网 发布:java开发培训学费 编辑:程序博客网 时间:2024/05/16 14:40

因为要在非主线程中去更新UI线程的UI,所以在非主线程中发送Handler,通过Handler来更新UI


import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import com.example.android_lb_handler.R;/***** 让一个文本的值递增* **/public class MainActivity extends Activity {     TextView text;     Button btn_start;     int count;     @Override     protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          text = (TextView) findViewById(R.id.text1);          btn_start = (Button) findViewById(R.id.btn_start);          //点击按钮就会执行一个定时器          btn_start.setOnClickListener(new OnClickListener() {               @Override               public void onClick(View v) {                    new Timer().schedule(new TimerTask() {                         @Override                         public void run() {                              //创建消息对象                              Message msg = new Message();                              msg.obj="任意类型的数据";                              msg.what=0;                              //发送到Handler                              handler.sendMessage(msg);                         }                    }, 0, 1000);               }          });     }     Handler handler = new Handler() {          public void handleMessage(android.os.Message msg) {               //首先要判断msg.what的值是由哪个线程发过来的               if (msg.what == 0) {                    //  String data=(String) msg.obj; 这段代码可以得到msb.obj对象                    //改变UI                    text.setText(count + "");                    count++;               }          };     };         public void like(View v) {          Intent i = new Intent(MainActivity.this, LikeActivity.class);          startActivity(i);     }}




 
 Handler 的常用方法

l handleMessage(Message msg) :处理消息的方法。该方法通常用于被重写。

l hasMessages(int what) :检查消息队列中是否包含 what属性为指定值的消息

l hasMessages(int what, Object object) :检查消息队列中是否包含 what属性为指定值且 object属性为指定对象的消息

l 多个重载的 obtainMessage():获取消息

l sendEmptyMessage(int what):发送空消息


l sendEmptyMessageDelayed(int what, long delayMillis) :指定多少毫秒之后发送空消息

l sendMessage(Message msg) :立即发送消息

l sendMessageDelayed(Message msg, long delayMillis)

Message的定义
对于Handler来说可以传递一些内容,通过 Bundle对象可以封装 String Integer以及 Blob二进制对象,我们通过在线程中使用 Handler对象的 sendEmptyMessage sendMessage方法来传递一个 Bundle对象到 Handler处理器。对于 Handler类提供了重写方法 handleMessage(Message msg) 来判断,通过 msg.what来区分每条信息。将 Bundle解包来实现 Handler类更新 UI线程中的内容实现控件的刷新操作。
Message的四个参数说明
通过obtain(Handler h, int what, int arg1, int arg2, Object obj)来获取Message
其中:

l what  用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个 handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他 handlers有冲突

l arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型

l obj




0 0
原创粉丝点击