最新消息:关注【已取消】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

Android自定义监听器Listener(自定义Java Callback回调事件)

Android 太平洋学习网 浏览 评论

Callback回调事件介绍


Java或Android中创建异步回调最普遍的做法就是使用listener监听器或者observer观察者模式来解决,listener回调事件通常用于实现一个代码去监听另一个类或方法发生的事情,Android中的监听器listener最流行的莫过于Button按钮的OnClickListener了,下面来开始学习吧!

先来看看Button的onClick事件的代码吧!

Button btnExample = (Button) findViewById(R.id.btnExample);
btnExample.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do something here    
    }
});

如何自定义Android回调事件


我们要做一个类似于Button按钮的回调事件,该如何做呢?先来看自定义listener监听事件的步骤:

1:定义一个接口

2:父类中设置一个成员变量,以及setter方法

3:实现监听事件内部的接口

4:触发Java监听事件

一:定义一个监听事件接口:

public class MyCustomObject {
  // Step 1 - This interface defines the type of messages I want to communicate to my owner  
  public interface MyCustomObjectListener {

      public void onObjectReady(String title);

      public void onDataLoaded(SomeData data);
  }
}

二:创建Listener成员变量,代码如下:

public class MyCustomObject {
    // ...

    // Step 2 - This variable represents the listener passed in by the owning object
    // The listener must implement the events interface and passes messages up to the parent.
    
    private MyCustomObjectListener listener;
}

在父类中添加setter方法,代码如下:

public class MyCustomObject {
    // Constructor where listener events are ignored
    
    public MyCustomObject() {
        // set null or default listener or accept as argument to constructor
        this.listener = null; 
    }
	
    // Assign the listener implementing events interface that will receive the events
    public void setCustomObjectListener(MyCustomObjectListener listener) {
        this.listener = listener;
    }
}

三:在别的类中实现监听事件内部的接口

public class MyParentActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {

    	object.setCustomObjectListener(new MyCustomObject.MyCustomObjectListener() {
    		@Override
    		public void onObjectReady(String title) {
    		    // Code to handle object ready
    		}
    		
    		@Override
    		public void onDataLoaded(SomeData data) {
    		    // Code to handle data loaded from network
    		    // Use the data here!
    		}
    	});
    }
}

四:触发Callback监听事件:

public class MyCustomObject {
   // Listener defined earlier
   public interface MyCustomObjectListener {
      public void onObjectReady(String title);
      public void onDataLoaded(SomeData data);
   }
   
   // Member variable was defined earlier
   private MyCustomObjectListener listener;

    public MyCustomObject() {
        // set null or default listener or accept as argument to constructor
        this.listener = null; 
        loadDataAsync();
    }
  
    // ... setter defined here as shown earlier
    //假如这是一个网络加载事件
    public void loadDataAsync() {
        AsyncHttpClient client = new AsyncHttpClient();
        client.get("https://mycustomapi.com/data/get.json", new JsonHttpResponseHandler() {         
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                SomeData data = SomeData.processData(response.get("data"));

                // 触发Java监听事件
                if (listener != null)
                  listener.onDataLoaded(data); // <---- fire listener here
            }
        });
    }
}

总结


“Android自定义监听器Listener(自定义Java Callback回调事件)”是很有必要的,java监听事件通常用于异步网络加载,Android activity或fragment之间的参数传递,事件回调等,很有必要!

Java接口回调的几种方式


1:通过方法来回调监听事件

2:通过构造器来回调监听事件

3:通过lifecycle生命周期来回调参数

一:通过方法来回调监听事件

下方演示的是通过接口方法来回调listener监听事件,代码如下:

// 在父类方法中
childObject.setCustomObjectListener(new MyCustomObject.MyCustomObjectListener() {
    @Override
    public void onObjectReady(String title) {
        // Code to handle object ready
    }
});

我们在MyCustomObject父类中是这样定义的,代码:

// Inside the child object
private MyCustomObjectListener listener;

// 将接口作为参数传入方法中
public void setCustomObjectListener(MyCustomObjectListener listener) {
    this.listener = listener;
}

二:通过构造器来回调监听事件

将接口作为参数放在MyCustomObject父类的构造方法中,代码如下:

// Inside the child object
private MyCustomObjectListener listener;

// 将接口放在构造方法中
public MyCustomObject(MyCustomObjectListener listener) {
    this.listener = listener; 
}

我们可以在创建父类对象时,这样使用构造器回调,代码如下:

// Inside the parent object
MyCustomObject object = new MyCustomObject(new MyCustomObject.MyCustomObjectListener() {
    @Override
    public void onObjectReady(String title) {
        // Code to handle object ready
    });
});

三:通过lifecycle生命周期来回调接口,一般是在另外一个类中直接实现接口类就行了

public class MyListFragment extends Fragment {
  
  private MyCustomObjectListener listener;

  
  @Override
  public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof MyCustomObjectListener) {
        listener = (MyCustomObjectListener) context;
    } else {
        throw new ClassCastException(context.toString()
            + " must implement MyListFragment.MyCustomObjectListener");
    }
  }
}

具体怎么使用生命周期来回调接口,后续小编会制作完整教程供大家使用。

来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/android/1066.html
"文章很值,打赏犒劳作者一下"
微信号: Javaweb_engineer

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

与本文相关的文章

发表我的评论
取消评论

表情

您的回复是我们的动力!

  • 昵称 (必填)

网友最新评论