1. 程式人生 > >android中的回撥-介面回撥

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介面機制的理解

對於介面回撥機制首先要弄明白的問題是為什麼需要它,也就是介面回撥能為我們解決什麼問題: 在開發過程中我們經常會遇到一些有關觸發執行的問題,比如使用者觸發按鈕,然後程式就執行了一系列的操作的比如註冊登入啊;問題的核心在於為什麼是出發了按鈕才執行,不觸發就不執行嗎? 這個時候就能體現出各

AndroidRecyclerview使用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的內部的,覺得看起來很亂的感覺,畢竟廣播也事和活動是同一級別的元件之一,哪兒能放在活動的裡面啊,決定就來封裝一下,發現居然沒有思路,,同事說用靜態類,直接點就可以了, 但是靜態類在記憶體中不會被回收,只有等程式結束後才會回收,所以決

AndroidService與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)上添加回調介面事件。其實難點就在添加回調介面事件上,怎麼寫介面,介面回撥在哪裡,這才是關鍵。下面是個例子: 介面的寫法:一下是兩介

基於介面詳解JUCCallable和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中新增相