1. 程式人生 > >Android 抽象回撥函式以及介面回撥更新UI

Android 抽象回撥函式以及介面回撥更新UI

回撥函式使用,使得程式碼變得部分跟不變部分更加明顯,程式碼整體上有一個質的提升。

我是用抽象類裡寫的抽象回撥函式,通過通知註冊介面形式,可以隨時傳遞資料,接受資料。

同時我用介面函式回撥更新UI。下面請看程式碼。

抽象類CallBackListenner.java

package com.example.recallbackdemo;

//回撥抽象類CallBackListenner
public abstract class CallBackListenner {
	// 回撥函式
	public abstract void CallBackTime(int ntime);

}
介面類OnTimeUpdateListInterface.java
package com.example.recallbackdemo;

//更新UI介面
public interface OnTimeUpdateListInterface {
	//抽象回撥方法
     public abstract void UpdateUIInterface(int ntime);
}


時間管理類TimeManage.java

package com.example.recallbackdemo;

import android.os.Handler;

public class TimeManage {
	private int i = 0;
	private CallBackListenner mcallBackListenner = null;

	// 註冊通知回撥函式
	public void ReCallBackListenner(CallBackListenner callBackListenner) {
		mcallBackListenner = callBackListenner;
	}

	Handler handler = new Handler();
	// 將要執行的操作寫線上程物件的run方法當中
	Runnable updateThread = new Runnable() {
		public void run() {
			// 停留1秒
			handler.postDelayed(updateThread, 1000);
			mcallBackListenner.CallBackTime(i);
			i++;
		}
	};

	// 開始計時
	public void StartTime() {
		if (i == 0) {
			handler.post(updateThread); // 啟動執行緒
		}

	}

	// 結束計時
	public void EndTime() {
		handler.removeCallbacks(updateThread);
		i = 0;
		mcallBackListenner.CallBackTime(i);
	}

}


MainActivity

package com.example.recallbackdemo;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnTimeUpdateListInterface {

	private TimeManage mTimeManage = new TimeManage();;
	private int mntime = 0;
	private TextView mtvTime;
	private Handler mHandlerUI = new Handler() {
		public void handleMessage(Message msg) {
			Bundle dataBundle = msg.getData();
			if (dataBundle == null)
				return;
			mntime = dataBundle.getInt("time");
			if (mntime >= 0)
				mtvTime.setText(String.valueOf(mntime));
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mtvTime = (TextView) findViewById(R.id.tv_time);

		// 回撥函式接受函式
		mTimeManage.ReCallBackListenner(new CallBackListenner() {
			@Override
			public void CallBackTime(int ntime) {
				mntime = ntime;
				UpdateUIInterface(mntime);
			}
		});
	}

	// 按鍵開始監聽
	public void Start(View v) {
		if (mntime > 0) {
			Toast.makeText(getApplicationContext(), "已經開始計時....",
					Toast.LENGTH_LONG).show();
		} else {
			mTimeManage.StartTime();
		}
	}

	// 按鍵結束監聽
	public void End(View v) {
		mTimeManage.EndTime();
	}

	// 實現介面類裡的抽象函式,用來回調更新ui內容
	public void UpdateUIInterface(int ntime) {
		Message msg = new Message();
		Bundle dataBundle = new Bundle();
		dataBundle.putInt("time", ntime);
		msg.setData(dataBundle);
		mHandlerUI.sendMessage(msg);

	}
}

xml檔案

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:gravity="center" >

        <TextView
            android:id="@+id/tv_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="66sp"
            android:text="0" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="Start"
            android:text="開始" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="End"
            android:text="結束" />
    </LinearLayout>

</LinearLayout>



這裡還是用了執行緒實時更新UI。

demo還是前一章計時器,實現方法用了回撥機制。

相關推薦

Android 抽象函式以及介面更新UI

回撥函式使用,使得程式碼變得部分跟不變部分更加明顯,程式碼整體上有一個質的提升。 我是用抽象類裡寫的抽象回撥函式,通過通知註冊介面形式,可以隨時傳遞資料,接受資料。 同時我用介面函式回撥更新UI。下面

Android : Recyclerview的使用以及介面

先上效果圖 Recyclerview是沒有點選事件的,所以介面回撥就是寫的點選事件 需要用到的jar包 implementation 'com.android.support:recyclerview-v7:28.0.0' android.support.v7.widget

TLS函式以及反除錯簡單使用

TLS回撥函式以及反除錯簡單使用 0x00  TLS介紹   TLS(Thread Local Storage,執行緒區域性儲存),主要用於給執行緒獨立的傳值,由於執行緒不擁有程序的資源,所以幾個同一程序的幾個執行緒需要獨立賦值時的需要通過TLS技術。每個執行緒建立時都會分配

Recyclerview的使用以及介面

先上效果圖 Recyclerview是沒有點選事件的,所以介面回撥就是寫的點選事件 需要用到的jar包 implementation 'com.android.support:recyclerview-v7:28.0.0' android.support.

Node.js的函式以及事件迴圈

Node.js回撥函式 Node.js是單程序單執行緒應用程式,但是可以通過事件和回撥支援併發操作 Node.js的非同步程式設計依託於回撥實現。Node.js中有大量的回撥函式函式,Node的所有API都支援回撥函式。 非同步程式設計就是併發性的執行程式

【cocos2d-x從c++到js】函式1——按鍵

回撥函式是介面互動和接入各種第三方SDK的關鍵所在,因為回撥函式的C++程式碼是不能自動生成的,一切的一切,都需要手寫完成。 比較不錯的是,Cocos2d-x引擎對於回撥函式提供了完整的包裝機制。我們所需要做的就是了解這個機制,並使用他。學習引擎自己的程式碼

Android執行緒模型--在子執行緒中更新UI

       Android是支援多執行緒的。主執行緒也稱UI執行緒,子執行緒也稱工作執行緒。一般耗時操作在子執行緒中進行,更新UI操作在主執行緒中進行。在主執行緒中執行耗時操作容易發生ANR錯誤,即應用程式無響應。而Android中又規定只有建立UI的執行緒

C++函式呼叫Java介面抽象函式

專案中很多程式碼採用C++編寫,配置介面則採用BS結構,使用Java語言進行設定。因此需要實現Java呼叫C++編寫的函式庫(dll檔案或so檔案),採用的技術為JNI(Java Native Interface),對於常用的呼叫方式在《The Java Native In

c的函式與java中抽象函式介面函式抽象類簡單理解

先了解c語言的回撥函式,舉個簡單例項步步深入,比如A程式提供給B程式使用,但是A想要呼叫B的程式碼,這樣各自不同功能由B實現即可。 例項1A: extern int get_B_data(); void A_data_handle(){ printf("%d\n",get

Android遠端服務AIDL的使用以及配合介面使用

遠端服務的介面回撥 Android 開發中的一些場景需要用到程序間通訊,一般使用AIDL(Android Interface Definition Language)。使用AIDL繫結一個遠端服務,遠端服務可以被其他應用繫結,繫結後可以使用定義在AIDL介

Android介面總結,以及運用到彈窗PopWindow的Demo實現

背景: 最近專案中接觸到介面回撥,以及Android彈窗PopWindow元件的使用,現在利用學到的知識自己寫了一個簡單的Demo,練習下在Android下如何運用介面回撥,來實現彈窗PopWindow的功能。 程式碼結構: 1. 定義一個介面:OnSelectIt

emWin介面庫注意事項之自定義函式之後,控制代碼為0

        由於在嵌入式裝置上可供使用的介面庫很少,專案當中所使用的介面庫為德國SEGGER公司開發的emWin介面庫。使用上和windows的GDI大致類似,也提供了豐富的API介面。如果我們需要對控制元件進行自繪的話,一定要進行的一個操作是通過設定回撥

26、【支付模組開發】——支付寶函式實現和查詢使用者訂單狀態介面編寫

####1、支付寶回撥函式實現 我們在除錯支付寶沙箱環境的時候,支護寶會有一個回撥函式,也就是在支付成功之後,可以呼叫我們支付之後需要執行的相關方法,從而達到資料庫的資料和我們的操作相統一。 首先我們先在本地將回調函式編寫好~ 在OrderController類中新建我們的支付寶回撥函式

egret 全屏, 和載入資源, 以及函式

1, 有時候在手機瀏覽器中因為有  虛擬按鍵以及標題欄, 使得即便設定了全屏也沒有辦法變成全屏, 但是好像JS 中有方法向瀏覽器請求全屏 2, 載入資源, 關閉後解除安裝, 第二次再進來的時候依然很快, 這是因為瀏覽器有快取 3, egret的回撥函式十分的隨便, 帶引數的回撥函式

jquery序列化表單以及函式的使用

在開發專案中。將前臺的值傳給後臺,有時的JSP表單中的值有一兩個,也有所有的值,假設這時一個個傳,必然不是非常好的辦法,所以使用jQuery提供的表單序列化方法,能夠非常好的解決問題。同一時候能夠封裝成通用的函式,執行成功能夠呼叫各自的回撥函式。實現各自的功能。 程式碼例如以下:

對於Android介面機制的理解

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

Android 介面實現Fragment的跳轉

---------------------MainActivity------------------- package com.example.earl.fragmentinterfacejump; import android.app.Activity; import androi

如何解決微信小程式介面適配問題-引用-生命週期函式-優化機制-樣式引入

如何解決微信小程式介面適配問題 .wxss page{ height: 100%; width:750rpx; } this.setData({ imageWidth: wx.getSystemInfoSync().windowWidth }) rpx(res

Python學習【第21篇】:程序池以及函式 python併發程式設計之多程序2-------------資料共享及程序池和函式

python併發程式設計之多程序2-------------資料共享及程序池和回撥函式 一、資料共享 1.程序間的通訊應該儘量避免共享資料的方式 2.程序

結合Dialog的onClick()事件理解Android中的函式三部曲

App都少不了的一個需求,那就是Dialog彈窗,而且通常一個應用中都不止一個Dialog彈窗,多的時候可能達到六七個,那麼你是否會為你的應用重複寫六七個彈窗:ExitLoginDialog、DownDialog、UpdateDialog……如果是使用系統的Dialog還好,可以直接new一個