匿名内部类实现接口回调的总结以及demo

一、Android中为什么使用匿名内部类的方式?

   使用一次之后会自动被填充到垃圾回收机制被销毁,节省手机的内存,所以在Android中使用普遍。

二、如何使用

方式1

      1.1定义一个接口

     1.2 声明对象

     

      1.3.需要传递数据的地方写一个方法,然后把接口作为实际参数传递进去

      1.4、在获取数据的地方注册一下此接口,并实现接口的方法

          

 

         

源码:

GetAsynData接口:
public interface GetAsynData {
    void setName(String name);
}
MyHandler 类(传递数据的类)
public  class MyHandler extends Handler {
    WeakReference<MainActivity> mainActivityWeakReference;
    public MyHandler(MainActivity mainActivity) {
        mainActivityWeakReference = new WeakReference<MainActivity>(mainActivity);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        String name = msg.getData().getString("name");
        if (getAsynData!=null) {
            getAsynData.setName(name);
        }
    }
    public GetAsynData getAsynData ;
    public void setOnClickListener(GetAsynData getAsynData){
            this.getAsynData = getAsynData;
    }
}

MainActivity  接收数据的类

public class MainActivity extends AppCompatActivity implements GetAsynData {
    MyHandler handler = new MyHandler(this);
    private TextView mTvName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        Message message = Message.obtain();
        message.what = 0;
        Bundle bundle = new Bundle();
        bundle.putString("name", "lucy");
        message.setData(bundle);
        handler.sendMessage(message);
    }

    private void initView() {
        mTvName = findViewById(R.id.id_tv_name);
        handler.setOnClickListener(this);
    }

    @Override
    public void setName(String name) {
        mTvName.setText(name);
    }
}

方式二:使用构造函数的方式,匿名内部类

 2.1创建一个接口

 

 2.2 声明接口并创建构造函数

2.3匿名内部类的方式实现接口

 

源码:

GetAsynData 接口
public interface GetAsynData {
    void setName(String name);
}
传递数据
public  class MyHandler extends Handler {
    WeakReference<MainActivity> mainActivityWeakReference;
    public GetAsynData getAsynData ;
    public MyHandler(MainActivity mainActivity,GetAsynData getAsynData) {
        mainActivityWeakReference = new WeakReference<MainActivity>(mainActivity);
        this.getAsynData = getAsynData;
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        String name = msg.getData().getString("name");
        if (getAsynData!=null) {
            getAsynData.setName(name);
        }
    }

}

接收数据:

public class MainActivity extends AppCompatActivity {
    MyHandler handler = new MyHandler(this, new GetAsynData() {
        @Override
        public void setName(String name) {
            mTvName.setText(name);
        }
    });
    private TextView mTvName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        Message message = Message.obtain();
        message.what = 0;
        Bundle bundle = new Bundle();
        bundle.putString("name", "lucy");
        message.setData(bundle);
        handler.sendMessage(message);
    }

    private void initView() {
        mTvName = findViewById(R.id.id_tv_name);
    }

}
源码已经贴出来了,就暂时不提供demo了
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值