android回撥函式
版權宣告:您好,轉載請留下本人部落格的地址,謝謝 https://blog.csdn.net/hongbochen1223/article/details/46837287
在我們進行android開發的時候,經常遇到一些回撥函式,其中,我們最常用的回撥就是,當我們對一個元件設定監聽的時候,其實就相對於設定的回撥函式。例如:
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就是回撥函式,這樣看來,就相當於實現一個雙向呼叫。
我們在進行android開發的時候,經常使用一些開源社群貢獻的一些有關於網路獲取資料或者是下載圖片的開源包,這些包裡面用到了很多回撥函式,現在我們就是用一個獲取網路資料的例子,來看一看如何定義自己的回撥函式。
首先需要宣告的是,回撥函式是試用介面實現的。我們一步一步來實現回撥函式。
1:定義一個介面,其中定義一些需要用到的回撥函式。
名稱:DownInterface.java
package interfaces;
public interface DownInterface {
//需要用到的回撥函式
public void onDownloadSuccess(String result);
}
2:定義工具類,呼叫回撥函式
該工具類有以下屬性:
- 類中有剛剛所定義的介面的物件
- 類的建構函式中,剛剛定義的介面作為引數
- 在需要呼叫介面函式的時候,呼叫介面函式
我們在這裡實現一個工具類,該工具類實現從網路中獲取資料,當獲取資料成功的時候,呼叫介面中的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()等這些函式其實都是回撥函式。其實我們使用回撥函式也能定義自己的下載工具類,等過幾天我定義一個這樣的工具類,試驗一下。大家可以試一下如何自己定義一個回撥函式。
相關文章
- 回撥函式函式
- JavaScript 回撥函式JavaScript函式
- JavaScript回撥函式JavaScript函式
- JS—回撥函式JS函式
- 動畫回撥函式動畫函式
- java回撥函式Java函式
- 回撥函式(CallBack)函式
- [JS]回撥函式和回撥地獄JS函式
- 回撥函式,求積函式函式
- 回撥函式 與 函式閉包函式
- 函式指標&回撥函式Callback函式指標
- 回撥函式的作用函式
- TLS回撥函式(Note)TLS函式
- java 回撥函式示例Java函式
- Python回撥函式Python函式
- 函式回撥(C++)函式C++
- JS閉包函式和回撥函式JS函式
- C++回撥函式 用法C++函式
- 回撥函式的理解(一)函式
- Python/OpenCV:回撥函式PythonOpenCV函式
- java回撥函式機制Java函式
- JS之回撥函式(callback)JS函式
- js中的回撥函式JS函式
- js函式回撥錯誤JS函式
- c++回撥函式(下)C++函式
- Java回撥函式的理解Java函式
- C++回撥函式示例C++函式
- c#之回撥函式C#函式
- 回撥函式快速使用 (轉)函式
- java回撥函式-非同步回撥-簡明講解Java函式非同步
- 函式指標的重要用途——回撥函式函式指標
- 深入理解 JavaScript 回撥函式JavaScript函式
- setInterval 回撥函式傳引數函式
- js 徹底理解回撥函式JS函式
- 第二章 回撥函式函式
- js 中的submit 回撥函式JSMIT函式
- 回撥函式透徹理解Java函式Java
- delphi中回撥函式差異函式