EventBus、Handler、Broadcast用法

来源:互联网 发布:爰淘宝商城 编辑:程序博客网 时间:2024/05/22 04:51

1、EventBus

1)在需要post事件的地方使用如下语句:

EventBus.getDefault().post(new ReadEvent ("hahahaha"));

post 的内容是一个对象,比如

public class ReadEvent {
    private String code = "";

    public ReadEvent (String code){
        this.code = code;
    }
    public String getCode(){
        return this.code;
    }
}

2)在需要接受该事件,进行数据处理的类里面需要进行如下操作:

第一、在onResume里面注册EventBus

if (!EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().register(this);
        }

第二、在onPause里面解注册EventBus

if (EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().unregister(this);
        }

第三、在该类里面加上onEvent方法,在onEvent里面可以处理从其他类或者线程里面传过来的数据

public void onEvent(ReadEvent event) {
        String code = event.getCode();
        ......

}

2、Handler

   例如,更新UI线程里面的进度条,在UI线程里面直接先定义一个Handler对象,覆盖handleMessage方法,在其中更新UI(或者定义一个类继承Handler,然后再初始化里面new一个那个类的对象也行)
    Handler updateBarHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            //super.handleMessage(msg);
            //显示进度条
            progress_bar.setProgress(msg.arg1);
            //重新把线程加入到队列中
            updateBarHandler .post(updateThread);
        }      
    };

在UI线程里面定义一个Runnable 对象,即开启一个子线程,子线程对数据操作,然后通过sendMessage把数据发到Handler消息队列里面,最后接收进行UI更新

Runnable updateThread= new Runnable()
    {
        int i = 0;
        public void run() {
            // TODO Auto-generated method stub
            i += 10;
            //首先获得一个消息结构
            Message msg = updateBarHandler .obtainMessage();
            //给消息结构的arg1参数赋值
            msg.arg1 = i;
            //延时1s
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            //把消息发送到消息队列中
            updateBarHandler .sendMessage(msg);
            if(i == 100)
                //把线程从线程队列中移除
                updateBarHandler .removeCallbacks(updateThread);
        }      
    };

3、Broadcast

1)、定义一个继承BroadcastReceiver类的广播接收类,实现onReceive方法

public class BroadCastTest1 extends BroadcastReceiver {
    public BroadCastTest1() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        String name = intent.getStringExtra("name");
        Toast.makeText(context, "广播------:" + name, Toast.LENGTH_SHORT).show();
    }
}

2)、注册该广播类

(1)、静态注册即在AndroidManifest.xml里面注册

<receiver
     android:name=".BroadCastTest1"
     android:enabled="true"
     android:exported="true" >
      <intent-filter >
           <action android:name="bc.test101" />
      </intent-filter>
</receiver>

intent-filter 用于过滤intent

(2)、动态注册即在java代码中注册

BroadCastTest1 bCastTest1 = new BroadCastTest1();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("bc.test102");
MainActivity.this.registerReceiver(bCastTest1, intentFilter);

IntentFilter  用于过滤intent

3)、在需要发送广播的地方使用sendBroadcast发送广播

intent.setAction("bc.test101");
intent.putExtra("name", "静态的");
sendBroadcast(intent);

intent.setAction("bc.test102");
intent.putExtra("name", "动态的");
sendBroadcast(intent);

下面附上一段改写的网上代码,通过开启一个Service,在里面使用广播更新UI界面数据的例子

MainActivity的代码如下:

public class MainActivity extends ActionBarActivity implements View.OnClickListener {

    Intent intent = new Intent();
    BroadCastTest1 bCastTest1 = new BroadCastTest1();
    public static final int CMD_STOP_SERVICE = 0;
    TextView tv;//TextView对象应用
    DataReceiver dataReceiver;//BroadcastReceiver对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.tv);
        findViewById(R.id.send).setOnClickListener(this);
        findViewById(R.id.static_register).setOnClickListener(this);
        findViewById(R.id.action_register).setOnClickListener(this);
        findViewById(R.id.stop_register).setOnClickListener(this);
        findViewById(R.id.start_service).setOnClickListener(this);
        findViewById(R.id.stop_service).setOnClickListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        dataReceiver = new DataReceiver();
        IntentFilter filter = new IntentFilter();//创建IntentFilter对象
        filter.addAction("com.roy.MyActivity");
        registerReceiver(dataReceiver, filter);//注册Broadcast Receiver
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {         
            case R.id.static_register:
                intent.setAction("bc.test101");
                intent.putExtra("name", "静态的");
                sendBroadcast(intent);
                break;
            case R.id.action_register:
                IntentFilter intentFilter = new IntentFilter();
                intentFilter.addAction("bc.test102");
                MainActivity.this.registerReceiver(bCastTest1, intentFilter);
                intent.setAction("bc.test102");
                intent.putExtra("name", "动态的");
                sendBroadcast(intent);
                break;
            case R.id.stop_register:
                unregisterReceiver(bCastTest1);
                break;
            case R.id.start_service:
                Intent myIntent = new Intent(MainActivity.this, MyService.class);
                MainActivity.this.startService(myIntent);//发送Intent启动Service
                break;
            case R.id.stop_service:
                Intent myIntent1 = new Intent();//创建Intent对象
                myIntent1.setAction("com.roy.MyService");
                myIntent1.putExtra("cmd", CMD_STOP_SERVICE);
                sendBroadcast(myIntent1);//发送广播
                break;
            default:
                break;
        }
    }

    private class DataReceiver extends BroadcastReceiver {//继承自BroadcastReceiver的子类
        @Override
        public void onReceive(Context context, Intent intent) {//重写onReceive方法
            double data = intent.getDoubleExtra("data", 0);
            tv.setText("Service的数据为:"+data);
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(dataReceiver);//取消注册Broadcast Receiver
    }
 
}


下面是布局文件代码:


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/static_register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="静态发送广播" />

    <Button
        android:id="@+id/action_register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="动态发送广播" />

    <Button
        android:id="@+id/stop_register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="取消注册广播" />

    <View
        android:background="#000000"
        android:layout_width="match_parent"
        android:layout_height="2dp"/>

    <TextView
        android:id="@+id/tv"
        android:text="hahah"
        android:textSize="24sp"
        android:textColor="#000000"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

    <Button
        android:id="@+id/start_service"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始服务" />

    <Button
        android:id="@+id/stop_service"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止服务" />

</LinearLayout>


下面是Service代码:

public class MyService extends Service {

    CommandReceiver cmdReceiver;
    boolean flag;

    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        flag = true;
        cmdReceiver = new CommandReceiver();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        IntentFilter filter = new IntentFilter();//创建IntentFilter对象
        filter.addAction("com.roy.MyService");
        registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver
        doJob();//调用方法启动线程
        return super.onStartCommand(intent, flags, startId);
    }

    //方法:
    public void doJob(){
        new Thread(){
            public void run(){
                while(flag){
                    try{//睡眠一段时间
                        Thread.sleep(1000);
                    }
                    catch(Exception e){
                        e.printStackTrace();
                    }
                    Intent intent = new Intent();//创建Intent对象
                    intent.setAction("com.roy.MyActivity");
                    intent.putExtra("data", Math.random());
                    sendBroadcast(intent);//发送广播
                }
            }
        }.start();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.unregisterReceiver(cmdReceiver);//取消注册的CommandReceiver
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private class CommandReceiver extends BroadcastReceiver {//继承自BroadcastReceiver的子类
        @Override
        public void onReceive(Context context, Intent intent) {//重写onReceive方法
            int cmd = intent.getIntExtra("cmd", -1);//获取Extra信息
            if(cmd == MainActivity.CMD_STOP_SERVICE){//如果发来的消息是停止服务
                flag = false;//停止线程
                stopSelf();//停止服务
            }
        }
    }

}














0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 拼多多快递签收了但没收到货怎么办 顺丰代收签收成功要强制退款怎么办 淘宝付了钱如果商家没货了怎么办 别人拿走我的货不给钱怎么办 快递出途中损坏签单后才发现怎么办 顾客支付宝少付了钱人走了怎么办 顾客通过收钱码付的钱少了怎么办 寄顺丰快递收件人号码填错了怎么办 京东退货售后说是有划痕怎么办 手机上快递员软件签收错了怎么办 苹果手机进网许可证丢了怎么办 作废的普票发票联丢失怎么办 想退换货但是发票丢了怎么办 快递没有当面验货造成的丢件怎么办 退货卖家收货验货说有问题怎么办 没当着快递人员面验货少货怎么办 微信绑定的银行了被快捷支付怎么办 银行支付到微信支付里的钱怎么办 微信绑定银行忘支付密码忘了怎么办 微信桂林银行不可以支付怎么办 微信忘记支付密码和银行卡号怎么办 京东商城迟迟不通过退货审核怎么办 网上购物想退款商家要我拒收怎么办 运输公司对车主不买保险怎么办 苹果平板限制访问密码忘了怎么办 安卓手机忘了解锁密码怎么办 海之蓝扫码显示域名不对这是怎么办 华为手机丢了帐号密码忘记了怎么办 电脑会员系统账号密码忘记了怎么办 推广渠道客户要求免费铺货怎么办 代理机构做的网站找不到人了怎么办 瓷砖买的和描述的不一样怎么办 网上买东西地址的省份写错了怎么办 驾校把预留号码注册错了怎么办 太害羞了不敢进店买东西怎么办 收件箱邮箱邮件满了但不想删怎么办 模拟人生畅玩版任务时间过了怎么办 快递放柜子里长时间不拿怎么办 古筝的筝码序号错了怎么办? 极限竞速3地平线爆内存怎么办 车载导航安卓系统禁止装软件怎么办