在咱們進行android開發的時候,經常遇到一些回調函數,當中,咱們最經常使用的回調就是,當咱們對一個組件設置監聽的時候,事實上就相對於設置的回調函數。好比:php
Button btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new Button.OnClickListener(){//建立監聽
public void onClick(View v) {
String strTmp = "點擊Button01";
Ev1.setText(strTmp);
}
});
首先咱們瞭解一下什麼叫作回調函數。若是咱們有兩個類,分別爲A和B。當中A需要調用B中的函數。但是B也需要調用A中的函數C,則C就是回調函數,這樣看來,就至關於實現一個雙向調用。java
咱們在進行android開發的時候。經常使用一些開源社區貢獻的一些有關於網絡獲取數據或者是下載圖片的開源包,這些包裏面用到了很是多回調函數,現在咱們就是用一個獲取網絡數據的樣例,來看一看怎樣定義本身的回調函數。android
首先需要聲明的是,回調函數是試用接口實現的。咱們一步一步來實現回調函數。apache
1:定義一個接口,當中定義一些需要用到的回調函數。markdown
名稱:DownInterface.java網絡
package interfaces;
public interface DownInterface {
//需要用到的回調函數
public void onDownloadSuccess(String result);
}
2:定義工具類,調用回調函數app
該工具類有如下屬性:ide
咱們在這裏實現一個工具類,該工具類實現從網絡中獲取數據,當獲取數據成功的時候,調用接口中的onDownloadSuccess()函數。將數據傳送給調用該類的對象。函數
如下咱們定義這個工具類:工具
DownLoadEventNotifier .java
package interfaces;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import com.sdu.utils.StaticValue;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class DownLoadEventNotifier {
private DownInterface dif;
//處理數據接收完畢以後。調用接口函數
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if(msg.what == 0){
String back = (String)msg.obj;
dif.onDownloadSuccess(back);
}
}
};
public DownLoadEventNotifier(DownInterface dif){
this.dif = dif;
}
//開始進行下載
public void start(String req,String url){
new Thread(new DealThread(req, url)).start();
}
class DealThread implements Runnable{
private String req;
private String url;
public DealThread(String req,String url){
this.req = req;
this.url = url;
}
@Override
public void run() {
// TODO Auto-generated method stub
deal();
}
private void deal(){
Log.e("req",req); //獲取響應內容
List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
params.add(new BasicNameValuePair("REQUEST", req));
try {
//http://jiduoduo.duapp.com
//http://211.87.227.124/study.php
HttpPost postMethod = new HttpPost(StaticValue.URL+url);
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //將參數填入POST Entity中
Log.e("url",StaticValue.URL+url); //獲取響應內容
HttpResponse response = new DefaultHttpClient().execute(postMethod); //運行POST方法
String back = EntityUtils.toString(response.getEntity(), "utf-8");
Log.e("result", "result = " + back); //獲取響應內容
Message msg = Message.obtain();
msg.obj = back;
msg.what = 0;
handler.sendMessage(msg);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3:使用該工具類
如下咱們看一下。怎樣使用該工具類。在A類中,若是有一個Button,點擊該按鈕以後,獲取網絡中的數據,當網絡中的數據獲取成功以後。打印出該數據。
如下咱們看一下調用的代碼:
package com.sdu.activities;
import interfaces.DownInterface;
import interfaces.DownLoadEventNotifier;
import com.sdu.androidmarket.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class TestActivity extends Activity{
private Button btn;
private DownLoadEventNotifier den;
@Override
protected void onCreate(Bundle savedInstanceState) {
btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
den = new DownLoadEventNotifier(new DownInterface() {
@Override
public void onDownloadSuccess(String result) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
}
});
}
});
super.onCreate(savedInstanceState);
}
}
看到了吧。是否是感受很是熟悉?咱們經常使用的下載工具包,裏面有onLoading(),onSuccess(),onStop()等這些函數事實上都是回調函數。
事實上咱們使用回調函數也能定義本身的下載工具類,等過幾天我定義一個這種工具類,試驗一下。你們可以試一下怎樣自定義一個回調函數。