Android之觀察者ContentObserver
註冊觀察者
使用ContentResolver.registerContentObserver(Uri, boolean, ContentObServer)方法可以註冊, 傳入指定Uri, 是否監聽子級路徑, 和一個觀察者物件
在收到資料改變通知之後, 會自動執行onChange()方法
通知觀察者
ContentProvider類中的insert方法新增通知觀察者的方法(其他方法一樣)
在應用程式中可以對內容提供者(ContentProvider)註冊一個觀察者(ContentObserver)
註冊觀察者的時候需要用到內容提供者的URI。
建立類繼承ContentObserver, 重寫onChange()方法使用ContentResolver.registerContentObserver(Uri, boolean, ContentObServer)方法可以註冊, 傳入指定Uri, 是否監聽子級路徑, 和一個觀察者物件
在收到資料改變通知之後, 會自動執行onChange()方法
通知觀察者
註冊觀察者之後, 需要在ContentProvider內容提供者中進行通知, 觀察者才能收到, 使用ContentResolver.notifyChange()方法可以通知資料的改變
在應用中註冊某個內容提供者的觀察者
import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri = Uri.parse("content://com.xxc.test.provider");
getContentResolver().registerContentObserver(uri, true, new MyContentObserver());//監聽指定uri(包括子集uri路徑)修改操作
}
private class MyContentObserver extends ContentObserver {
public MyContentObserver() {
super(new Handler());//Handler是一個處理器,目前沒有用到
}
@Override
public void onChange(boolean selfChange) {//當ContentProvider中資料改變,就會執行該方法
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.xxc.test.provider/person");
Cursor c = resolver.query(uri, null, null, null, "id DESC LIMIT 1");//查詢最後一條的資料
if(c.moveToNext()){
Toast.makeText(getApplicationContext(), c.getString(1)+"<--->"+c.getInt(2), Toast.LENGTH_SHORT).show();
}
}
}
}
ContentProvider類中的insert方法新增通知觀察者的方法(其他方法一樣)
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = helper.getWritableDatabase();
switch (matcher.match(uri)) {
case PERSON:
long id = db.insert("person","name,balance", values);//插入資料,返回id值得
//通知觀察者資料已經進行了修改 引數二暫時先為null
getContext().getContentResolver().notifyChange(uri, null);
return ContentUris.withAppendedId(uri, id);//將id值跟在uri後返回
default:
throw new RuntimeException("Uri不能識別--->"+uri);
}
}
public void testInsert(){
ContentResolver resolver = getContext().getContentResolver();
Uri uri = Uri.parse("content://com.xxc.test.provider/person");
ContentValues values = new ContentValues();
values.put("name", "海闊天空");
values.put("balance", 1000);
uri = resolver.insert(uri, values);
System.out.println(uri);
}
相關文章
- Android之觀察者模式Android模式
- PHP 之觀察者模式PHP模式
- Android設計模式原始碼解析之ListView觀察者模式Android設計模式原始碼View
- 設計模式之觀察者模式設計模式
- 設計模式之-觀察者模式設計模式
- 設計模式之【觀察者模式】設計模式
- PHP 設計模式之觀察者模式PHP設計模式
- PHP設計模式之觀察者模式PHP設計模式
- Go 設計模式之觀察者模式Go設計模式
- 設計模式之觀察者模式(一)設計模式
- JavaScript設計模式之觀察者模式JavaScript設計模式
- 「HEAD-FIRST」之觀察者模式模式
- PHP 設計模式之——觀察者模式PHP設計模式
- golang設計模式之觀察者模式Golang設計模式
- Java 設計模式之《觀察者模式》Java設計模式
- RxJava 原始碼解析之觀察者模式RxJava原始碼模式
- Java設計模式之觀察者模式Java設計模式
- iOS設計模式之觀察者模式iOS設計模式
- 設計模式系列之「觀察者模式」設計模式
- php模式設計之 觀察者模式PHP模式
- Android 中的設計模式:觀察者模式Android設計模式
- python設計模式之觀察者模式Python設計模式
- 設計模式之觀察者模式(Observer Pattern)設計模式Server
- Java設計模式之(十二)——觀察者模式Java設計模式
- Java常用設計模式之觀察者模式Java設計模式
- 淺談設計模式之觀察者模式設計模式
- 23種設計模式之觀察者模式設計模式
- java設計模式之觀察者模式(9)Java設計模式
- 觀察者模式-將訊息通知給觀察者模式
- 觀察者模式模式
- OC觀察者模式之KVO的使用與思考模式
- 折騰Java設計模式之觀察者模式Java設計模式
- 17.java設計模式之觀察者模式Java設計模式
- js物件導向之 觀察者模式介紹JS物件模式
- JavaScript設計模式經典之觀察者模式JavaScript設計模式
- PHP觀察者模式PHP模式
- Unity——觀察者模式Unity模式
- 觀察者模式(2)模式