精华内容
下载资源
问答
  • EventBus使用详解(一)——初步使用EventBus

    万次阅读 多人点赞 2014-10-31 20:16:10
    前言:EventBus是上周项目中用到的,网上的文章大都一样,或者过时,有用的没几篇,经过琢磨,请教他人,也终于弄清楚点眉目,记录下来分享给大家。 相关文章: 1、《EventBus使用详解(一)——初步使用EventBus...

    前言:EventBus是上周项目中用到的,网上的文章大都一样,或者过时,有用的没几篇,经过琢磨,请教他人,也终于弄清楚点眉目,记录下来分享给大家。

     

    相关文章:

    1、《EventBus使用详解(一)——初步使用EventBus》

    2、《EventBus使用详解(二)——EventBus使用进阶》

     

    一、概述

    EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
    1、下载EventBus的类库
    源码:https://github.com/greenrobot/EventBus

    2、基本使用

    (1)自定义一个类,可以是空类,比如:

     

    public class AnyEventType {
    	 public AnyEventType(){}
     }

     

    (2)在要接收消息的页面注册:

     

    eventBus.register(this);

     

    (3)发送消息

     

    eventBus.post(new AnyEventType event);

    (4)接受消息的页面实现(共有四个函数,各功能不同,这是其中之一,可以选择性的实现,这里先实现一个):

     

    public void onEvent(AnyEventType event) {}

    (5)解除注册

    eventBus.unregister(this);

    顺序就是这么个顺序,可真正让自己写,估计还是云里雾里的,下面举个例子来说明下。

     

    首先,在EventBus中,获取实例的方法一般是采用EventBus.getInstance()来获取默认的EventBus实例,当然你也可以new一个又一个,个人感觉还是用默认的比较好,以防出错。

     

    二、实战

    先给大家看个例子:

     

    当击btn_try按钮的时候,跳到第二个Activity,当点击第二个activity上面的First Event按钮的时候向第一个Activity发送消息,当第一个Activity收到消息后,一方面将消息Toast显示,一方面放入textView中显示。

    按照下面的步骤,下面来建这个工程:

    1、基本框架搭建

    想必大家从一个Activity跳转到第二个Activity的程序应该都会写,这里先稍稍把两个Activity跳转的代码建起来。后面再添加EventBus相关的玩意。

    MainActivity布局(activity_main.xml)

     

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        
        <Button 
            android:id="@+id/btn_try"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="btn_bty"/>
        <TextView 
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"/>
    
    </LinearLayout>

    新建一个Activity,SecondActivity布局(activity_second.xml)

     

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.harvic.try_eventbus_1.SecondActivity" >
    
        <Button 
            android:id="@+id/btn_first_event"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="First Event"/>
    
    </LinearLayout>

    MainActivity.java (点击btn跳转到第二个Activity)

     

    public class MainActivity extends Activity {
    
    	Button btn;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		btn = (Button) findViewById(R.id.btn_try);
    
    		btn.setOnClickListener(new View.OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				Intent intent = new Intent(getApplicationContext(),
    						SecondActivity.class);
    				startActivity(intent);
    			}
    		});
    	}
    
    }
    

    到这,基本框架就搭完了,下面开始按步骤使用EventBus了。

     

    2、新建一个类FirstEvent

     

     

    package com.harvic.other;
    
    public class FirstEvent {
    
    	private String mMsg;
    	public FirstEvent(String msg) {
    		// TODO Auto-generated constructor stub
    		mMsg = msg;
    	}
    	public String getMsg(){
    		return mMsg;
    	}
    }

    这个类很简单,构造时传进去一个字符串,然后可以通过getMsg()获取出来。

     

    3、在要接收消息的页面注册EventBus:

    在上面的GIF图片的演示中,大家也可以看到,我们是要在MainActivity中接收发过来的消息的,所以我们在MainActivity中注册消息。

    通过我们会在OnCreate()函数中注册EventBus,在OnDestroy()函数中反注册。所以整体的注册与反注册的代码如下:

     

    package com.example.tryeventbus_simple;
    
    import com.harvic.other.FirstEvent;
    
    import de.greenrobot.event.EventBus;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
    	Button btn;
    	TextView tv;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
                    //注册EventBus
    		EventBus.getDefault().register(this);
    
    		btn = (Button) findViewById(R.id.btn_try);
    		tv = (TextView)findViewById(R.id.tv);
    
    		btn.setOnClickListener(new View.OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				Intent intent = new Intent(getApplicationContext(),
    						SecondActivity.class);
    				startActivity(intent);
    			}
    		});
    	}
    	@Override
    	protected void onDestroy(){
    		super.onDestroy();
    		EventBus.getDefault().unregister(this);//反注册EventBus
    	}
    }
    

    4、发送消息

    发送消息是使用EventBus中的Post方法来实现发送的,发送过去的是我们新建的类的实例!

     

    EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));

    完整的SecondActivity.java的代码如下:

     

    package com.example.tryeventbus_simple;
    
    import com.harvic.other.FirstEvent;
    
    import de.greenrobot.event.EventBus;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class SecondActivity extends Activity {
    	private Button btn_FirstEvent;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_second);
    		btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);
    
    		btn_FirstEvent.setOnClickListener(new View.OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				EventBus.getDefault().post(
    						new FirstEvent("FirstEvent btn clicked"));
    			}
    		});
    	}
    }
    

    5、接收消息

    接收消息时,我们使用EventBus中最常用的onEventMainThread()函数来接收消息,具体为什么用这个,我们下篇再讲,这里先给大家一个初步认识,要先能把EventBus用起来先。

     

    在MainActivity中重写onEventMainThread(FirstEvent event),参数就是我们自己定义的类:

    在收到Event实例后,我们将其中携带的消息取出,一方面Toast出去,一方面传到TextView中;

    	public void onEventMainThread(FirstEvent event) {
    
    		String msg = "onEventMainThread收到了消息:" + event.getMsg();
    		Log.d("harvic", msg);
    		tv.setText(msg);
    		Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    	}

    完整的MainActiviy代码如下:

     

    package com.example.tryeventbus_simple;
    
    import com.harvic.other.FirstEvent;
    
    import de.greenrobot.event.EventBus;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
    	Button btn;
    	TextView tv;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		EventBus.getDefault().register(this);
    
    		btn = (Button) findViewById(R.id.btn_try);
    		tv = (TextView)findViewById(R.id.tv);
    
    		btn.setOnClickListener(new View.OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				Intent intent = new Intent(getApplicationContext(),
    						SecondActivity.class);
    				startActivity(intent);
    			}
    		});
    	}
    
    	public void onEventMainThread(FirstEvent event) {
    
    		String msg = "onEventMainThread收到了消息:" + event.getMsg();
    		Log.d("harvic", msg);
    		tv.setText(msg);
    		Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    	}
    
    	@Override
    	protected void onDestroy(){
    		super.onDestroy();
    		EventBus.getDefault().unregister(this);
    	}
    }
    

    好了,到这,基本上算初步把EventBus用起来了,下篇再讲讲EventBus的几个函数,及各个函数间是如何识别当前如何调用哪个函数的。
     

     

    如果我的文章有帮到你,请关注哦。

    源码地址:http://download.csdn.net/detail/harvic880925/8111357

    请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/40660137   谢谢!

     

    如果你喜欢我的文章,你可能更喜欢我的公众号

    启舰杂谈

    展开全文
  • EventBus

    千次阅读 2016-05-09 14:44:23
    EventBus
    概述

    EventBus是一款针对Android优化的发布/订阅事件总线。

    主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,

    线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
    1、下载EventBus的类库
    jar:http://download.csdn.net/detail/menglele1314/9514367

    EventBus的使用

    首先必须要入库
    onCreate() 注册EventBus EventBus.register(Object ),注册的对象决定发布事件的参数
    所在方法的反射范围,一般用this,表示扫描当前类中所有的方法。
    onDestroy() 注销EventBus EventBus.unRegister(Object)
    发布事件:EventBus.post(参数) 参数可以是任何类型,一般为实体类。
    一般在子线程中发布获得的数据,然后通过在主线程中的方法来接收参数,并更新UI。
    注意:处理事件的方法一定要加上@Subscribe注解
    EventBus.getDefault().register(this);//订阅事件
    EventBus.getDefault().post(object);//发布事件
    EventBus.getDefault().unregister(this);//取消订阅

    PostThread
    这是默认的模式,订阅者会在发布者所在的线程中调用。这种模式开销最小,避免了线程之间的切换。所以完成时间很短,并且不需要主线程参与的简单任务建议使用这种模式。例如:
    public void onEvent(FirstEvent event) {
        log(event.getMsg());
    }

    MainThread
    这种模式订阅者会在主线程中调用。如果事件发布是在主线程,那么事件处理程序会立即被调用。使用这种模式事件处理必须尽快返回,以避免阻塞主线程。例如:
    public void onEventMainThreadFirstEvent event) {
        log(event.getMsg());
    }

    BackgroundThread
    这种模式订阅者会在后台线程中调用。如果事件发布不在主线程,事件处理方法会直接在发布线程中调用;如果事件发布在主线程,EventBus则会依次传递所有的事件到一个后台进程。使用这种模式必须尽快返回以避免阻塞后台进程。
    public void onEventBackgroundThread(MessageEvent event){
        log(event.getMsg());
    }

    Async
    事件处理方法在一个单独的线程中调用。他始终是独立于发布线程和主线程。发布事件不需要等待事件处理方法的完成。如果使用耗时的操作应当使用这种模式,比如连接网络。应当避免同一时间触发大量的、长时间运行的异步处理方法,从而限制并发线程的数量。EventBus使用了线程池来有效的重用线程。
    public void onEventAsync(MessageEvent event){
        log(event.getMsg());
    }


    展开全文
  • eventBus

    2020-11-10 16:50:29
    import eventBus from ‘…/mlib/util/eventbus.js’; beforeDestroy(){ var that = this; eventBus.$emit('configItemKey', { 'configItemKey': that.configItemKeylist, 'type': that.type, 'scrollTop':...

    1.在一个组件里面
    引入eventbus
    import eventBus from ‘…/mlib/util/eventbus.js’;

       beforeDestroy(){
          var that = this;
          eventBus.$emit('configItemKey', {
            'configItemKey': that.configItemKeylist,
            'type': that.type,
            'scrollTop':this.scrollTop
          });
        },
    

    2.在另一个组件接收

     created() {
         eventBus.$off('configItemKey');先消除免得重复获取
     	this.getEventBus();
    }
    getEventBus() {
    	var that = this;
    	eventBus.$on('configItemKey', function (data) {
              that.$nextTick(() => {
                	that.channelItemKey = data.configItemKey; 
              })
        
     	}) 
    }
    

    3.eventBus组件:

    import Vue from 'vue'
    /**
     * 定义空的vue实例,作为 eventbus实现非父子组件之间的通信(vue2.x中去掉了broadcast)
     */
    var eventBus = new Vue({});
    export default eventBus;
    
    展开全文
  • eventbus

    2019-05-11 13:27:00
    flutter中的eventbus其实就是Stream的一种特殊形式,本质上就是Stream,咱们都知道状态树自父节点向多少有子节点遗传数据采用的是InheritedWidget,自下而上冒泡采用的是Notification,那么同级别的Widget之间传递信息...
    flutter中的eventbus其实就是Stream的一种特殊形式,本质上就是Stream,咱们都知道状态树自父节点向多少有子节点遗传数据采用的是InheritedWidget,自下而上冒泡采用的是Notification,那么同级别的Widget之间传递信息采用的就是EventBus,我从来也记不住eventbus的使用的具体格式,每次用的时候我都会去pub上面搜索EventBus,然后根据示例来用,简单来讲分为两步,第一步创建EventBus,第二步是发射Event,第三步监听Event。补充一点就是Event是一个数据类,所有需要发送的数据都放在这个数据类里面就可以了,可以发送任何数据,放开手脚去玩耍吧!


    下面这是一个简单的示例:
    import 'package:flutter/material.dart';

    import 'package:event_bus/event_bus.dart';

    void main() => runApp(MyApp());

    class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    home: HomePage(),
    );
    }
    }

    class HomePage extends StatefulWidget {
    @override
    _HomePageState createState() => _HomePageState();
    }

    class _HomePageState extends State<HomePage> {
    EventBus _eventBus = EventBus();
    Widget initWidget = Text('init data');
    int count = 0;
    @override
    void initState() {
    // TODO: implement initState
    _eventBus.on<SendEvent>().listen((event) {
    // All events are of type UserLoggedInEvent (or subtypes of it).
    initWidget = event._widget;
    });
    super.initState();
    }

    @override
    Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(
    title: Text('event'),
    ),
    body: ListView(
    children: <Widget>[
    Center(
    child: RaisedButton(
    child: Icon(Icons.add),
    onPressed: () {
    Widget sendContent = Image.network(
    'http://www.ecobentech.com/images/$count.jpg',
    );
    _eventBus.fire(SendEvent(sendContent));
    if (count == 20) {
    count = 0;
    } else {
    count++;
    }
    setState(() {

    });
    }),
    ),
    initWidget,
    ],
    ),
    );
    }
    }

    class SendEvent {
    Widget _widget;
    SendEvent(this._widget);
    }

    转载于:https://www.cnblogs.com/braveheart007/p/10848400.html

    展开全文
  • Eventbus

    2019-03-03 19:56:54
    implementation ‘org.greenrobot:eventbus:3.0.0’ 传值的页面写 EventBus.getDefault().post(id); 接值页面写 EventBus.getDefault().register(上下文.this); 自定义方法 @Subscribe public void getjie(String ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,721
精华内容 6,288
关键字:

eventbus