Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android回調函數

android回調函數

編輯:關於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:定義工具類,調用回調函數

該工具類有以下屬性:

類中有剛剛所定義的接口的對象 類的構造函數中,剛剛定義的接口作為參數 在需要調用接口函數的時候,調用接口函數

我們在這裡實現一個工具類,該工具類實現從網絡中獲取數據,當獲取數據成功的時候,調用接口中的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 params = new ArrayList();  
            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()等這些函數其實都是回調函數。其實我們使用回調函數也能定義自己的下載工具類,等過幾天我定義一個這樣的工具類,試驗一下。大家可以試一下如何自己定義一個回調函數。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved