简单使用EventBus,告别繁琐的接口回调(1)

接口回调虽然繁琐,但也是必须掌握的一个技巧,接口回调的用法很多,首先搞清楚什么时候需要用接口回调,怎么使用接口回调。

public class InterQueryDataActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_interquery);
        initView();
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            name_tv.setText(msg.getData().getString("name"));
        }
    };
    private  TextView name_tv;
    private void initView() {
        Button query_btn = (Button) findViewById(R.id.query_btn);
        name_tv = (TextView) findViewById(R.id.name_tv);
        query_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                InternetQueryData internetQueryData = new InternetQueryData(new InternetQueryData.QuerySuccessListener() {
                    @Override
                    public void onQuerySuccess(String msg) {
//                        name_tv.setText(msg);
                        Message message = new Message();
                        Bundle bundle = new Bundle();
                        bundle.putString("name",msg);
                        message.setData(bundle);
                        handler.sendMessage(message);
                    }
                });
                internetQueryData.queryData();

            }
        });
    }
}
public class InternetQueryData {

    public interface QuerySuccessListener{
        void onQuerySuccess(String msg);
    }

    private QuerySuccessListener querySuccessListener;
    public InternetQueryData(QuerySuccessListener querySuccessListener){
        this.querySuccessListener = querySuccessListener;
    }

    public void queryData(){
        //线程睡眠模仿网络请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(4000);
                    String msg = "程序员大亨";
                    querySuccessListener.onQuerySuccess(msg);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button android:id="@+id/query_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请求数据"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="name:"/>
        <TextView android:id="@+id/name_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""/>

    </LinearLayout>


</LinearLayout>

以上的例子中,在InterQueryDataActivity 中按下按钮时去进行一个请求(模仿网络请求),由InternetQueryData这个网络请求管理类执行操作。我们新建一个线程模拟网络连接请求数据的过程。

当睡眠4s后,我们取到了数据,此时怎么返回给activity进行UI的展示呢,这时候就需要用到接口回调了。

我们创建一个接口QuerySuccessListener,在这个接口中定义一个抽象方法onQuerySuccess,参数msg呢,则是你需要用到的数据,当然这里可以是任意参数,自己定义即可。

然后我们在构造器中要求外部调用我们这个网络请求管理类的时候必须传入这个接口的一个实例对象,重写onQuerySuccess方法,在此方法中得到我们需要的数据并且执行我们需要的操作。

在本例中,我们四秒后将name传过去,并展示在textView上面。

 

posted @ 2017-02-23 12:04  程序员大亨  阅读(1032)  评论(0编辑  收藏  举报