android回呼函數

來源:互聯網
上載者:User

標籤:android   回呼函數   

在我們進行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:定義工具類,調用回呼函數

該工具類有以下屬性:

  1. 類中有剛剛所定義的介面的對象
  2. 類的建構函式中,剛剛定義的介面作為參數
  3. 在需要調用介面函數的時候,調用介面函數

我們在這裡實現一個工具類,該工具類實現從網路中擷取資料,當擷取資料成功的時候,調用介面中的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()等這些函數其實都是回呼函數。其實我們使用回呼函數也能定義自己的下載工具類,等過幾天我定義一個這樣的工具類,實驗一下。大家可以試一下如何自己定義一個回呼函數。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

android回呼函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.