浅谈Android中Callback(回调)的使用

今天Android项目的Bug基本修改完成了,于是就对自己还未了解的回调函数进行了学习。就得到的结果来看,个人觉得回调就像多态一样,比如Boss叫员工去吃饭,但每个员工可能吃不同的食物。只不过,回调是对接口而言。简单来说就是,A对象调用了自己的方法a,方法a接收的参数是B接口的实例b,而在方法a中将执行接口B中的方法c。这样解释可能有点绕不过来,下面我们来看一个例子。

比如宿舍的某个同学设置了一个闹铃,闹铃响时全宿舍的人都能听到,但是张三比较勤奋,听到铃声后起床了,李四比较懒,听到铃声后还要睡会。我们可以把闹铃发出的铃声看作是接口,张三和李四都实现了这个“接口”,闹铃到一定时间后就要“响铃”,响铃就要发出“铃声”,“铃声”就去叫人,至于人会做什么就是人本身的事情。下面看个代码。

1.接口CallPerson

  1. publicinterface CallPerson {
  2. publicabstractvoid doCallPerson ();
  3. }
定义了一个“叫人”的方法。实现这个接口可理解成安装了闹铃。
2.类Zhangsan
  1. publicclass Zhangsan implements CallPerson {
  2. String name = "Zhangsan";
  3. public String getName () {
  4. return name;
  5. }
  6. @Override
  7. publicvoid doCallPerson() {
  8. System.out.println(getName() + "听到铃声,勤鸟,起床了!");
  9. }
  10. }
3.类Lisi
  1. publicclass Lisi implements CallPerson {
  2. String name = "Lisi";
  3. public String getName () {
  4. return name;
  5. }
  6. @Override
  7. publicvoid doCallPerson() {
  8. System.out.println(getName() + "听到铃声,懒猪,没起床!");
  9. }
  10. }
4.类Alarm
  1. publicclass Alarm {
  2. //响铃 
  3. publicvoid ring (CallPerson callPerson) {
  4. callPerson.doCallPerson();
  5. }
  6. }
5.Activity
然后我们在Activity里模拟闹铃开始响铃
  1. import android.os.Bundle;
  2. import android.app.Activity;
  3. publicclass MainActivity extends Activity {
  4. @Override
  5. publicvoid onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.layout_main);
  8. Alarm alarm = new Alarm();
  9. Zhangsan zhangsan = new Zhangsan();
  10. Lisi lisi = new Lisi();
  11. //模拟闹铃定时时间到,然后响铃
  12. alarm.ring(zhangsan);
  13. alarm.ring(lisi);
  14. }
  15. }
最后,我们来看看执行的结果
  1. 12-07 21:49:41.947: INFO/System.out(6107): Zhangsan听到铃声,勤鸟,起床了!
  2. 12-07 21:49:41.947: INFO/System.out(6107): Lisi听到铃声,懒猪,没起床!
上面是引用别人的例子,

下面是我在项目中的应用

public interface CallTabHost {
    LayoutInflater createInflater();
    FragmentTabHost createTabhost();
}


在MainActivity中

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;

import com.hitler.hitler_n8.bottombar.BottomBar;
import com.hitler.hitler_n8.bottombar.CallTabHost;
import com.hitler.hitler_n8.widget.FragmentTabHost;

public class MainActivity extends AppCompatActivity implements CallTabHost {
    private LayoutInflater mInflater;
    private FragmentTabHost mTabhost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createButtombar();
    }

    private void createButtombar() {
        BottomBar bottomBar = new BottomBar(this);
        bottomBar.initTab();
        bottomBar.createInflater(this);
        bottomBar.createTabhost(this);
    }

    @Override
    public LayoutInflater createInflater() {
        mInflater = LayoutInflater.from(this);
        return mInflater;
    }

    @Override
    public FragmentTabHost createTabhost() {
        mTabhost = (FragmentTabHost) this.findViewById(android.R.id.tabhost);
        mTabhost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
        return mTabhost;
    }
}

在自定义的Bottombar中

public class BottomBar {
    private LayoutInflater mInflater;
    private FragmentTabHost mTabhost;
    private Context mContext;
    private List<Tab> mTabs = new ArrayList<>(3);

    public BottomBar(Context context){
        mContext = context;
    }

    /*用FragmentTabHost+Fragment实现底部的导航栏*/
    public void initTab() {
        Tab tab_home = new Tab(HomeFragment.class, R.string.home, R.drawable.selector_icon_home);
        Tab tab_activity = new Tab(ActivityFragment.class, R.string.activity, R.drawable.selector_icon_activity);
        Tab tab_mine = new Tab(MineFragment.class, R.string.mine, R.drawable.selector_icon_mine);

        mTabs.add(tab_home);
        mTabs.add(tab_activity);
        mTabs.add(tab_mine);
    }

    public void createInflater(CallTabHost callTabHost){
        mInflater = callTabHost.createInflater();
    }

    public void createTabhost(CallTabHost callTabHost){

        mTabhost = callTabHost.createTabhost();

        for (Tab tab : mTabs) {

            TabHost.TabSpec tabSpec = mTabhost.newTabSpec(Integer.toString(tab.getTitle()));

            tabSpec.setIndicator(buildIndicator(tab));

            mTabhost.addTab(tabSpec, tab.getFragment(), null);

        }

        mTabhost.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE);
        mTabhost.setCurrentTab(0);
    }

    private View buildIndicator(Tab tab) {

        View view = mInflater.inflate(R.layout.tab_indicator, null);
        ImageView img = (ImageView) view.findViewById(R.id.icon_tab);
        TextView text = (TextView) view.findViewById(R.id.txt_indicator);

        img.setBackgroundResource(tab.getIcon());
        text.setText(tab.getTitle());

        return view;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在UVM(Universal Verification Methodology)callback回调函数是一种在特定事件发生时自动调用的函数。这些事件可以是UVM定义的一些特定动作,例如创建或删除一个对象,或者在测试用例的不同阶段执行某些操作。 UVM使用callback回调函数的目的是在特定事件发生时执行一些自定义的操作,而不需要修改UVM的源代码。这样可以提高代码的可重用性和灵活性。 在UVMcallback回调函数通常是通过使用UVM提供的`uvm_callback`类来实现的。这个类是一个基类,用户可以从这个基类派生出自己的回调类,并重载其的虚拟函数来实现自定义的操作。例如,用户可以派生一个自己的回调类,并重载`execute`函数来定义在某个特定事件发生时执行的操作。 以下是一个示例代码片段,展示了如何在UVM使用callback回调函数: ```systemverilog class my_callback extends uvm_callback; // 重载execute函数来定义回调函数的操作 virtual function void execute(uvm_object obj); // 在这里编写自定义的操作 $display("Callback function called!"); endfunction endclass // 在需要使用callback回调函数的地方创建一个回调对象 my_callback callback; // 注册回调对象到对应的事件上 my_object.add_callback(callback); // 当事件发生时,回调函数会被自动调用 ``` 在上述示例,我们创建了一个名为`my_callback`的回调类,并重载了`execute`函数。然后,我们创建了一个回调对象`callback`,并将其注册到一个特定的事件上(`my_object.add_callback(callback)`)。当该事件发生时,execute`函数会被自动调用,并执行自定义的操作。 请注意,使用callback回调函数需要遵循UVM的规范和最佳实践。在实际使用,可以根据具体需求来设计和实现自己的callback回调函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值