接口回調(diào)本質(zhì)就這么簡單

一谢床、為什么會有接口回調(diào)?什么是接口回調(diào)厘线?

其實這兩個問題是一個問題萤悴,知道了接口回調(diào)的原理自然就知道了為什么會有這么個東西。我們知道java中接口是不可以直接創(chuàng)建實例的皆的,那么問題來了,假如我把一個接口聲明為一個變量蹋盆,那么我執(zhí)行這個接口中的方法费薄,接口沒有實例它該怎么辦呢?啊哈栖雾,這里自然又改出現(xiàn)java中的另一個特性---“多態(tài)”楞抡,這時java虛擬機自然會去找其子類,調(diào)用其子類中已經(jīng)重載的該方法析藕,這里就是接口回調(diào)的本質(zhì)U偻ⅰ!我們只需要給該變量指向其子類的地址就可以在調(diào)用的時候知道調(diào)用子類的方法账胧。那么我們就可以在A類中創(chuàng)建接口的子類實例竞慢,在B類中創(chuàng)建一個接口的變量,把A類的地址傳給B類的變量治泥,在變量執(zhí)行接口中的方法的時候就會調(diào)用A類中重寫的方法筹煮,這就是接口回調(diào)的執(zhí)行步驟。我們在網(wǎng)絡(luò)請求等耗時的操作的時候會使用到該機制居夹,用來把得到的數(shù)據(jù)傳回主線程中败潦。

二本冲、使用實例

下面我們就來用一個網(wǎng)絡(luò)請求的實例來演示如何使用該機制,為了盡量的減少代碼劫扒,使主要代碼能夠突出檬洞,里面的一些不必要的容錯代碼就沒有寫了,大家在正式的項目中希望可以做好容錯處理沟饥。

我們用一個按鈕和一個imageView來演示添怔,當(dāng)點擊按鈕的時候去下載數(shù)據(jù),在數(shù)據(jù)下載完成之后使用接口回調(diào)把數(shù)據(jù)傳回來顯示在imageview中闷板。效果如下:

布局文件很簡單就不在貼出來了澎灸,我們有3個類,一個是回調(diào)的接口遮晚,一個是主activity性昭,一個為執(zhí)行下載并且把數(shù)據(jù)回調(diào)回來的Callee類,下面來看接口類:

import android.graphics.Bitmap;

/**

* Created by JimLv on 2016/5/31.

*/

public interface CallBackInterface {

void result(Bitmap bm);

}

定義了一個用于傳遞數(shù)據(jù)的方法县遣,來看看Callee類:

import java.io.IOException;

import java.net.HttpURLConnection;

import java.net.URL;

/**

* Created by JimLv on 2016/5/31.

*/

public class Callee {

private final String IMGURL = "http://f.hiphotos.baidu.com/zhidao/pic/item/b21bb051f8198618a323ac464bed2e738ad4e688.jpg";

//持有接口變量

CallBackInterface mInterface;

Callee(CallBackInterface theInterface) {

//這里是關(guān)鍵糜颠,把外部的接口實例引用到該類,給變量賦值

mInterface = theInterface;

//創(chuàng)建對象的時候執(zhí)行下載

executeDown();

}

public void executeDown() {

new Thread(new Runnable() {

@Override

public void run() {

try {

HttpURLConnection conn = (HttpURLConnection) new URL(IMGURL).openConnection();

conn.setConnectTimeout(5 * 1000);

conn.setRequestMethod("GET");

mInterface.result(BitmapFactory.decodeStream(conn.getInputStream()));

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

}

}

在這里我們聲明了一個接口變量萧求,在類的初始化方法中把接口的子類的地址賦給該變量并且調(diào)用下載數(shù)據(jù)的方法其兴,在數(shù)據(jù)下載完成之后調(diào)用接口變量的方法把數(shù)據(jù)傳給該方法,執(zhí)行該方法實際是執(zhí)行子類的該方法夸政,這就是接口回調(diào)真正做的事。

最后我們來看MainActivity類:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private ImageView imgv;

private Button downImgBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imgv = (ImageView) findViewById(R.id.imgv);

downImgBtn = (Button) findViewById(R.id.downImgBtn);

//點擊按鈕去下載

downImgBtn.setOnClickListener(this);

}

@Override

public void onClick(View v) {

//從接口回調(diào)得到數(shù)據(jù),因為下載是在子線程中匀归,所以這里要變到主線程中設(shè)置圖片

new Callee(new CallBackInterface() {

@Override

public void result(final Bitmap bm) {

runOnUiThread(new Runnable() {

@Override

public void run() {

imgv.setImageBitmap(bm);

}

});

}

});

}

}

在這里我們用匿名內(nèi)部類創(chuàng)建該接口的子類實例穆端,子類重載的方法中因為是運行在子線程中的体啰,我們無法操作UI荒勇,所有調(diào)用了runOnUiThread方法枕屉,把數(shù)據(jù)更新到imageview中鲤氢,整個的demo就這么點是不是很簡單呢?

掃描關(guān)注我的微信公眾號:

三、總結(jié)

哈哈威恼,整個回調(diào)機制是不是很簡單呢箫措?其實以前不懂這個的時候也是很頭疼斤蔓,理不清里面的邏輯弦牡,百度上面的文章又是一大堆驾锰,可是里面內(nèi)容啰啰嗦嗦不知所云椭豫,真是肯爹不淺啊〈以撸“”該死的程序狗“”~~~~~~~~~~好啦,其實我也很討厭別人這么說姓言,不過無所謂啦何荚,我們是有上進心的工程師餐塘,不是和你家那位一樣的程序狗戒傻!弄懂了一個技術(shù)的本質(zhì)是什么之后使用起來才不會無從下手需纳,遇到問題才會知道如何解決。如果你覺得這篇文章寫的還不錯希望你點個贊兵扬,如果想看我以后寫的文章請關(guān)注我器钟,祝步步高升傲霸,天天開心灭必!

最后附上demo:點擊打開鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跟衅,一起剝皮案震驚了整個濱河市伶跷,隨后出現(xiàn)的幾起案子叭莫,更是在濱河造成了極大的恐慌雇初,老刑警劉巖减响,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刊橘,死亡現(xiàn)場離奇詭異促绵,居然都是意外死亡浓冒,警方通過查閱死者的電腦和手機裆蒸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辙谜,“玉大人装哆,你說我怎么就攤上這事×杓颍” “怎么了雏搂?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芙沥。 經(jīng)常有香客問我憨愉,道長径密,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任籽懦,我火速辦了婚禮暮顺,結(jié)果婚禮上羽氮,老公的妹妹穿的比我還像新娘煌往。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般厕妖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼刻伊。 笑死椒功,一個胖子當(dāng)著我的面吹牛捶箱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛾茉,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼讼呢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谦炬?” 一聲冷哼從身側(cè)響起悦屏,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎键思,沒想到半個月后础爬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡吼鳞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年看蚜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赔桌。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡供炎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疾党,到底是詐尸還是另有隱情音诫,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布雪位,位于F島的核電站竭钝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雹洗。R本人自食惡果不足惜香罐,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望时肿。 院中可真熱鬧庇茫,春花似錦、人聲如沸螃成。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顷霹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間击吱,已是汗流浹背淋淀。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留覆醇,地道東北人朵纷。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像永脓,于是被迫代替她去往敵國和親袍辞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法常摧,類相關(guān)的語法搅吁,內(nèi)部類的語法,繼承相關(guān)的語法落午,異常的語法谎懦,線程的語...
    子非魚_t_閱讀 31,643評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)溃斋,斷路器界拦,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • JAVA面試題 1、作用域public,private,protected,以及不寫時的區(qū)別答:區(qū)別如下:作用域 ...
    JA尐白閱讀 1,154評論 1 0
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應(yīng)用梗劫。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,592評論 1 114
  • ·不懼風(fēng)浪·
    休普閱讀 154評論 0 2