android中的回撥-介面回撥
發現很多初學者對於回撥,介面,抽象 等概念理解的不是很透徹。
今天就以我的經驗把 介面回撥給大家闡述一下。適合初學者看看。
先簡單說說我的理解吧,
所謂的介面回撥。
你先將介面定義好,然後在特定的條件下條用它。 可能很多初學者開始的時候很疑惑,其實這也東西你天天都在用。比如你點選一按鈕,你會很自覺地 設定他的監聽器(onclick事件),去實現他的onclick 方法 。
1,當用戶發出這個onclick 事件(使用者點選按鈕等)。
2,系統呼叫你設定的監聽器(設定的onclickListener)。
3,根據你的實現產生不同的結果(在onclick中實現的程式碼)。
下面我們就以 android 中從網路獲取json 資料為例 為大家詳細說下 什麼事所謂的介面回撥
對於android 我們首先 先了解幾個概念。
1,android 不允許在主執行緒中(Main thread)返回網路 長時間 的I/O操作 一些耗時的操作(這個很好理解了,就是要給使用者一個友好的體驗,所以不能阻塞UI)
2,子執行緒中不能操作UI元件(也就是在子執行緒中不能直接給textview imageview listview 賦值 等操作 )
3,因此我們通過執行緒通訊來完成 上面所說的操作(thread + handler 或者 通過AsyncTask 來完成我們的操作)
我選用 thread + headler 來完成這個操作 (AsyncTask 是 谷歌 封裝了 thread+ handler 的操作)
1,首選我們先定義介面 別問 為什麼 ,如果問 我會 告訴你為了通用程式設計 (或者說將變化的東西封裝起來 ,就是把你從網路獲取資料的這一步驟 給封裝了一下,但是獲取資料後 會有各種各樣的操作了,那你怎麼操作我就管不了了,就是所謂通用程式設計,如果還是懂。那就先這樣吧!)
定義介面我們可以思考一下需要哪些回撥。
a, 訪問網路的 成功一個 ,失敗一個。這個兩個非常必須,通常還會有其他的 (開始呼叫一個,載入中一個可以設定訪問的進度)
簡單寫個介面如下:
/**
* 網路請求監聽介面
* @author cyl
* email:[email protected]
* 2016年2月27日
*/
public interface CylNetListener{
/**
* 開始載入
*/
public void start();
/**
* 載入失敗
* @param code 訪問網路的狀態碼
* @param msg 錯誤異常資訊
*/
public void onError(int code,String msg);
/**
* 載入成功
* @param content
*/
public void onSuccess(String content);
}
2,下面的是核心的實現類
package com.cyl.callbactest.network;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.Handler;
import android.os.Message;
import com.cyl.callbactest.service.CylNetListener;
/**
*
* @author cyl
* @email [email protected]
* 2016年3月21日
*/
public class CylNetWork {
private CylNetListener listener;
/**
* 開始訪問
*/
public final static int startCode = 100;
/**
* 錯誤
*/
public final static int onEorrorCode = 101;
/**
* 得到資料
*/
public final static int onSuccessCode = 102;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
int what = msg.what;
switch (what) {
case startCode:
if(listener != null){
listener.start();
}
break;
case onEorrorCode:
if(listener != null){
listener.onError(msg.arg1, (String)msg.obj);
}
break;
case onSuccessCode:
if(listener != null){
if(listener != null){
listener.onSuccess((String)msg.obj);
}
}
break;
default:
break;
}
}
};
/**
* 網路訪問
* @param url 要訪問的地址
*/
public void request(final String url){
//這裡是簡單寫的 只對http 協議簡單判斷了一下
if(!url.contains("http")){
Message msg = Message.obtain();
msg.what = onEorrorCode;
msg.arg1 = 404;
msg.obj = "不是http協議";
handler.sendMessage(msg);
return;
}
//程式更好的 執行 這裡 的執行緒通過執行緒池 進行管理
new Thread(new Runnable() {
@Override
public void run() {
int code = 404;
try {
handler.sendEmptyMessage(startCode);
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
code = connection.getResponseCode();
//可以connection 進行各種設定 超時 ,代理 啊 新增header啊 等 這裡就不多寫了
if(code == 200){
//這裡直接對這個 流 進行了裝飾 容易讀取 資料
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line = null;
StringBuffer buffer = new StringBuffer();
while ((line = reader.readLine())!=null) {
buffer.append(line);
}
reader.close();
//到這裡 已經讀取了 我們所需要的資訊 如 json啊 xml 啊 (範例寫的是 String 字串型別的資料 檔案 不適用)
Message msg = Message.obtain();
msg.what = onSuccessCode;
msg.obj = buffer.toString();
handler.sendMessage(msg);
}
} catch (Exception e) {
//這裡丟擲異常 也是錯誤的情況 要對異常 進行處理
Message msg = Message.obtain();
msg.what = onEorrorCode;
msg.arg1 = code;
msg.obj = e.getMessage();
handler.sendMessage(msg);
}
}
}).start();
}
/**
* 設定回撥介面
* 當 開始 失敗 成功的時候 回撥這個介面
* 看見這個東西 應該很熟悉了吧
* @param listener
*/
public void setOnCylNetWorkListener(CylNetListener listener){
this.listener = listener;
}
}
2,點選test 我們既可以從 網路獲取 資料了 結果如下 :
搞定。。。。。。。。。
相關推薦
android中的回撥-介面回撥
發現很多初學者對於回撥,介面,抽象 等概念理解的不是很透徹。 今天就以我的經驗把 介面回撥給大家闡述一下。適合初學者看看。 先簡單說說我的理解吧, 所謂的介面回撥。 你先將介面定義好,然後在特定的條件下條用它。 可能很多初學者開始的時候很疑惑,其實這也東西你天天都在
Android http請求使用介面回撥
Android中不支援在主執行緒發起http請求資料,我們需要把http請求放到子執行緒中處理。為了保證程式碼的執行順序,可以使用介面回撥的方式拿到請求到的資料並進行處理。 定義回撥介面 public interface OnConnectResult
java 介面。Android Interface 自定義介面回撥。
不是很懂java 的Interface 介面的具體怎麼實現的。在網上看了很多例子,終於理解了那麼點啊。 因為原來在學習做一個微信的語音功能要做到一個介面功能。微信的後面有時間會寫出來。 Interf
關於在Fragment中通過Activity介面回撥操作Fragment中控制元件報空指標問題
現象描述:當Activity中某個變數改變時候,需要通知到Fragment我們常常用介面實現...。。我們在Activity中先replace,commit該Fragment,接著呼叫介面需要改變變數的方法。。。然後我們在Fragment中的介面回撥方法裡,更具該變數操縱F
談談-Android中的接口回調技術
賦值 布局 event public 理解 cti schema alt group Android中的接口回調技術有很多應用的場景,最常見的:Activity(人機交互的端口)的UI界面中定義了Button,點擊該Button時,執行某個邏輯。 下面參見上述執行的模
對於Android中介面回撥機制的理解
對於介面回撥機制首先要弄明白的問題是為什麼需要它,也就是介面回撥能為我們解決什麼問題: 在開發過程中我們經常會遇到一些有關觸發執行的問題,比如使用者觸發按鈕,然後程式就執行了一系列的操作的比如註冊登入啊;問題的核心在於為什麼是出發了按鈕才執行,不觸發就不執行嗎? 這個時候就能體現出各
Android中Recyclerview使用7----條目中按鈕點選事件,在activity中呼叫(介面回撥)
0引入Recyclerview的支援庫 compile 'com.android.support:recyclerview-v7:23.4.0' 1效果圖: 2程式碼: 2.1MainActivity中: <span style="font-size:18p
Android中介面回撥、方法回撥
在android開發中我們很多地方都用到了方法的回撥,回撥就是把方法的定義和功能匯入實現分開的一種機制,目的是為了解耦他的本質是基於觀察者設計模式,即觀察者設計模式的的簡化版,例如:在下載時候的進度回撥,在adapter與activity之間的回撥,在javabean和fr
Android在BroadcastReceiver中通過介面回撥更新介面
之前寫廣播接收器都是寫在Activity的內部的,覺得看起來很亂的感覺,畢竟廣播也事和活動是同一級別的元件之一,哪兒能放在活動的裡面啊,決定就來封裝一下,發現居然沒有思路,,同事說用靜態類,直接點就可以了, 但是靜態類在記憶體中不會被回收,只有等程式結束後才會回收,所以決
Android中Service與Activity的通訊---回撥介面方式
最近在技術交流群中有人問到:要實現service與activity的高強度通訊用什麼方法? 群友回答的是用handler,但面試官好像不太滿意,後來本人查找了下資料,得到個人的結論:service與activity之前的通訊方式有很多,回撥介面方式、觀察者模式、廣播、還有h
Android中的介面回撥詳解,回撥機制:以Activity和Adapter傳遞資料為例。
首先解決啥是回撥: 我覺得這個例子比較好:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該
Android 中的介面回撥
import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.text.TextPaint; import android.view.View; import androi
Android 介面回撥實現Fragment的跳轉
---------------------MainActivity------------------- package com.example.earl.fragmentinterfacejump; import android.app.Activity; import androi
介面回撥----點選item中的ImageView,在Activity中顯示dialog
在做專案的時候有一個功能是:點選listview的item中的一個圖示,在activity中彈出一個dialog.想到的一個辦法就是用介面回撥來實現.對於介面回撥這一塊我其實也還是不太懂,別人寫的複雜的一點的慢慢看也能看懂,但要自己寫的話,也就只能寫一些簡單的,這個demo就是一個很簡單
Android : Recyclerview的使用以及介面回撥
先上效果圖 Recyclerview是沒有點選事件的,所以介面回撥就是寫的點選事件 需要用到的jar包 implementation 'com.android.support:recyclerview-v7:28.0.0' android.support.v7.widget
Android 中介面卡與fragment或者activity的回撥使用
如何使用介面回撥 使用場景:在activity或者fragment與adapter的回撥中 介面卡中使用: public OnUpdat
Android中點選事件回撥介面踩坑心得
有時候寫程式碼的時候有這樣的功能要求,如在ListView或recyclerView中的Item中的控制元件(如Button,TextView)上添加回調介面事件。其實難點就在添加回調介面事件上,怎麼寫介面,介面回撥在哪裡,這才是關鍵。下面是個例子: 介面的寫法:一下是兩介
基於介面回撥詳解JUC中Callable和FutureTask實現原理
Callable介面和FutureTask實現類,是JUC(Java Util Concurrent)包中很重要的兩個技術實現,它們使獲取多執行緒執行結果成為可能。它們底層的實現,就是基於介面回撥技術。介面回撥,許多程式設計師都耳熟能詳,這種技術被廣泛應用於非同步模組的開發中。它的實現原理並不複雜,但是對初學
結合Dialog的onClick()事件理解Android中的回撥函式三部曲
App都少不了的一個需求,那就是Dialog彈窗,而且通常一個應用中都不止一個Dialog彈窗,多的時候可能達到六七個,那麼你是否會為你的應用重複寫六七個彈窗:ExitLoginDialog、DownDialog、UpdateDialog……如果是使用系統的Dialog還好,可以直接new一個
[Android]RecyclerView基本使用+adapter回撥介面實現點選事件
一、概述 RrcyclerView是ListView的加強版,不僅可以輕鬆實現和ListView同樣的效果,還優化了ListView中存在的各種不同之處。 Android官方推薦我們使用RecyclerView。 二、基本用法 1.首先需要在專案的build.gradle中新增相