ObsEvent——简洁又好用的事件管理框架

321 阅读2分钟
原文链接: github.com

GridViewPager

一个简洁又好用的事件管理框架。

采用观察者模式。只需要在将要接收事件的页面实现EvtObserver接口,并注册该事件注册到事件管理器EvtManager中,在页面销毁时再注销当前事件(不注销的话可能会导致OOM)

Demo

  • 效果图:

效果图

用法

  • 添加依赖

    dependencies {
      compile 'com.yhy.event:obsevt:lastestVersion'
    }
  • 在接收事件的页面实现EvtObserver接口,在getEvtCode()方法中返回本页所有的事件code数组,在notifyEvt(int evtCode, Bundle data)方法中解析事件。

    public class MainActivity extends AppCompatActivity implements EvtObserver {
      /**
       * 事件响应,解析事件
       * @param evtCode 事件code
       * @param data    事件携带的数据
       */
      @Override
      public void notifyEvt(int evtCode, Bundle data) {
        // 其他页面触发事件后该方法就被调用
        if (evtCode == 200) {
          if (null == data) {
            tvPageFirst.setText("200-data为空");
          } else {
            tvPageFirst.setText("200-" + data.getString("data"));
          }
        } else if (evtCode == 201) {
          if (null == data) {
            tvPageFirst.setText("201-data为空");
          } else {
            tvPageFirst.setText("201-" + data.getString("data"));
          }
        }
      }
    
      @Override
      public int[] getEvtCode() {
        // 确定本页面的事件code,也就是说本页面只接收code为200和201的事件
        return new int[]{200, 201};
      }
    }
  • 注册事件,在页面初始化时注册当前事件到事件管理器中

    public class MainActivity extends AppCompatActivity implements EvtObserver {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        // 注册事件
        EvtManager.getInstance().regist(this);
      }
    }
  • 触发事件,在需要触发事件的页面直接通过事件管理器和事件code来触发事件

    public class TestActivty extends AppCompatActivity {
    
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);
    
        findViewById(R.id.tv_test_first).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            Bundle args = new Bundle();
            args.putString("data", "数据测试1");
    		// 只能触发200事件
            EvtManager.getInstance().notifyEvt(200, args);
            finish();
          }
        });
    
        findViewById(R.id.tv_test_second).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            Bundle args = new Bundle();
            args.putString("data", "数据测试2");
            // 只能触发201事件
            EvtManager.getInstance().notifyEvt(201, args);
            finish();
          }
        });
    
        findViewById(R.id.tv_test_third).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            Bundle args = new Bundle();
            args.putString("data", "只改变的二页");
            // 只能触发202事件
            EvtManager.getInstance().notifyEvt(202, args);
            finish();
          }
        });
    
        findViewById(R.id.tv_test_forth).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            // 触发200事件,不带任何数据
            EvtManager.getInstance().notifyEvt(200);
            finish();
          }
        });
      }
    }
  • 注销事件,在页面销毁时注销当前事件,避免OOM

    public class MainActivity extends AppCompatActivity implements EvtObserver {
      @Override
      protected void onDestroy() {
        // 注销事件
        EvtManager.getInstance().unRegist(this);
      }
    }

License

Copyright 2017 yhyzgn

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.