接口回调虽然繁琐,但也是必须掌握的一个技巧,接口回调的用法不少,首先搞清楚何时须要用接口回调,怎么使用接口回调。android
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呢,则是你须要用到的数据,固然这里能够是任意参数,本身定义便可。ide
而后咱们在构造器中要求外部调用咱们这个网络请求管理类的时候必须传入这个接口的一个实例对象,重写onQuerySuccess方法,在此方法中获得咱们须要的数据而且执行咱们须要的操做。this
在本例中,咱们四秒后将name传过去,并展现在textView上面。spa