接口回調雖然繁瑣,但也是必須掌握的一個技巧,接口回調的用法不少,首先搞清楚何時須要用接口回調,怎麼使用接口回調。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