Android onLoadFinished與onLoaderReset

onLoadFinished

這個方法是在前面已創建的加載器已經完成其加載過程后被調用,這個方法保證會在應用到加載器上的數據被釋放之前被調用。在此方法中,你必須刪除所有對舊數據的使用(因為它將很快會被刪除),但是不要自己去釋放它們,因為它們的加載器會做這些事情。

加載器一旦了解到應用不再使用數據時,將馬上釋放這些數據。例如,如果數據是一個從CursorLoader來的游標,你不應調用游標的close(),如果游標被放置在一個CursorAdapter中,你應使用swapCursor()方法,以使舊的游標不被關閉。例如:

//這個Adapter被用于顯示列表的數據.  
SimpleCursorAdapter mAdapter;  
...  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {  // Swap the new cursor in.  (The framework will take care of closing the  // old cursor once we return.)  
    mAdapter.swapCursor(data);  
} 

onLoaderReset

當一個已創建的加載器被重置從而使其數據無效時,此方法被調用。此回調使你能發現什么時候數據將被釋放于是你可以釋放對它的引用。

下面這個實現調用參數為null的swapCursor():

// 這個Adapter被用于顯示列表的數據
SimpleCursorAdapter mAdapter;
...  public void onLoaderReset(Loader<Cursor> loader) {  //此處是用于上面的onLoadFinished()的游標將被關閉時執行,我們需確保我們不再使用它mAdapter.swapCursor(null);  
}

例子

作為一個例子,這里完整實現了一個Fragment顯示一個包含從聯系人contentprovider 返回查詢數據的ListView的內容的功能,它使用一個CursorLoader來管理對provider的查詢。

public static class CursorLoaderListFragment extends ListFragment  implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> {  // 這是用于顯示列表數據的Adapter  
    SimpleCursorAdapter mAdapter;  // 如果非null,這是當前的搜索過慮器  
    String mCurFilter;  @Override public void onActivityCreated(Bundle savedInstanceState) {  super.onActivityCreated(savedInstanceState);  // 如果列表中沒有數據,就給控件一些文字去顯示.在一個真正的應用  // 中這應用資源中取得.  setEmptyText("No phone numbers");  // 我們在動作欄中有一個菜單項.  setHasOptionsMenu(true);  // 創建一個空的adapter,我們將用它顯示加載后的數據  mAdapter = new SimpleCursorAdapter(getActivity(),  android.R.layout.simple_list_item_2, null,  new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },  new int[] { android.R.id.text1, android.R.id.text2 }, 0);  setListAdapter(mAdapter);  // 準備loader.可能是重連到一個已存在的或開始一個新的  getLoaderManager().initLoader(0, null, this);  }  @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {  // 放置一個動作欄項用于搜索.  MenuItem item = menu.add("Search");  item.setIcon(android.R.drawable.ic_menu_search);  item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);  SearchView sv = new SearchView(getActivity());  sv.setOnQueryTextListener(this);  item.setActionView(sv);  }  public boolean onQueryTextChange(String newText) {  // 在動作欄上的搜索字串改變時被調用.更新  //搜索過濾器,并重啟loader來執行一個新的查詢  mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;  getLoaderManager().restartLoader(0, null, this);  return true;  }  @Override public boolean onQueryTextSubmit(String query) {  // 我們不關心這個方法  return true;  }  @Override public void onListItemClick(ListView l, View v, int position, long id) {  // 寫入你想寫的代碼  Log.i("FragmentComplexList", "Item clicked: " + id);  }  // 這是我們想獲取的聯系人中一行的數據.  static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {  Contacts._ID,  Contacts.DISPLAY_NAME,  Contacts.CONTACT_STATUS,  Contacts.CONTACT_PRESENCE,  Contacts.PHOTO_ID,  Contacts.LOOKUP_KEY,  };  public Loader<Cursor> onCreateLoader(int id, Bundle args) {  // 當一個新的loader需被創建時調用.本例僅有一個Loader,  //所以我們不需關心ID.首先設置base URI,URI指向的是聯系人  
        Uri baseUri;  if (mCurFilter != null) {  baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,  Uri.encode(mCurFilter));  } else {  baseUri = Contacts.CONTENT_URI;  }  // 現在創建并返回一個CursorLoader,它將負責創建一個  // Cursor用于顯示數據  String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("  + Contacts.HAS_PHONE_NUMBER + "=1) AND ("  + Contacts.DISPLAY_NAME + " != '' ))";  return new CursorLoader(getActivity(), baseUri,  CONTACTS_SUMMARY_PROJECTION, select, null,  Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");  }  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {  // 將新的cursor換進來.(框架將在我們返回時關心一下舊cursor的關閉)  
        mAdapter.swapCursor(data);  }  public void onLoaderReset(Loader<Cursor> loader) {  //在最后一個Cursor準備進入上面的onLoadFinished()之前.  // Cursor要被關閉了,我們需要確保不再使用它.  mAdapter.swapCursor(null);  }  
}  

?

轉載于:https://www.cnblogs.com/zhujiabin/p/6400226.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456441.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HA機制的大數據集群的搭建過程

文章目錄集群規劃1、 準備Linux環境1.1、修改Linux主機名1.3、修改主機名和IP的映射關系1.4、關閉防火墻1.5、ssh免登陸&#xff08;主節點和從節點之間&#xff09;2、 安裝JDK2.1、上傳2.2、解壓jdk2.3、將java添加到環境變量中2.4、刷新配置2.5、驗證3、安裝zookeeper3.1、解…

Linux系統7個運行級別圖文詳解

Linux系統7個運行級別圖文詳解 當安裝linux操作系統時將選擇下列那一個操作 ______ A&#xff0e;選擇 "圖形登錄方式" 設定系統開始運行級為4 B&#xff0e;選擇 "文本登錄方式" 設定系統開始運行級為3 C&#xff0e;選擇 "文本登錄方式" 設定系…

CRISPR基因編輯

2007年&#xff0c;一家酸奶公司發現一種細菌擁有抵御病毒的特殊防御機制。2012年&#xff0c;細菌的這種機制就被科學家闡述清楚&#xff0c;2013年這一領域快速增長。它被視為分子生物學的一個奇跡&#xff0c;事實上&#xff0c;它并非僅對生物學家產生革命的影響&#xff0…

酒店之王

酒店之王 題目描述 XX酒店的老板想成為酒店之王&#xff0c;本著這種希望&#xff0c;第一步要將酒店變得人性化。由于很多來住店的旅客有自己喜好的房間色調、陽光等&#xff0c;也有自己所愛的菜&#xff0c;但是該酒店只有p間房間&#xff0c;一天只有固定的q道不同的菜。 有…

使用IntelliJ IDEA碰到的問題總結

文章目錄問題一&#xff1a;無法創建Java Class文件問題一&#xff1a;無法創建Java Class文件 今天打開項目時&#xff0c;發現右擊新建不了java.class文件&#xff0c;于是嘗試了以下方法&#xff1a; &#xff08;1&#xff09;選擇 File——>Project Structure——>…

為什么shell腳本第一行要#!/bin/sh

告訴操作系統, 此腳本的解釋器為 /bin/sh 這個可執行文件 類似地, 如果你的腳本用 bash, ksh, 解釋, 第一行就應該是#!/bin/bash #!/bin/ksh 之類的 或者, 你自己定義一種腳本語言, 再自己寫個解釋器去執行它, 比如說叫 xshell, 放在 /usr/local/bin 下, 你的腳本第一行就應該是…

linux文本處理常用指令總結

引子 作為一個偏愛windows的程序員&#xff0c;以前做文本處理的時候總是喜歡在windows下用notepad等圖形化工具處理&#xff0c;比如有時需要把linux服務器上一個文件進行一次全局字符串替換這樣簡單的操作&#xff0c;還得把文件down到本地編輯好再傳回去。這兩天買了本《鳥哥…

CSS——基礎選擇器

CSS的基礎選擇器1 CSS指的是層疊樣式表2 CSS規則由兩個主要的部分構成選擇器&#xff0c;以及一條或多條聲明3 選擇器通常是你需要改變樣式的 HTML 元素如h14 每條聲明由一個屬性和一個值組成&#xff0c;每個屬性有一個值&#xff0c;屬性和值被冒號分開5 屬性大于 …

Linux中chown和chmod的區別和用法

chmod修改第一列內容&#xff0c; chown修改第3、4列內容&#xff1a; chown用法&#xff1a; 用來更改某個目錄或文件的用戶名和用戶組。 chown 用戶名:組名 文件路徑&#xff08;可以是絕對路徑也可以是相對路徑&#xff09; 例1&#xff1a;chown root:root /tmp/tmp1 就…

玩大數據期間碰到的一些問題總結

文章目錄問題一&#xff1a;Zookeeper節點數量為什么建議是奇數個&#xff1f;問題二&#xff1a;HA機制的Hadoop集群中Journal Node 作用問題三&#xff1a;兩個datanode節點互相排斥怎么解決&#xff08;集群無法識別新加入的Datanode&#xff09;&#xff1f;問題四&#xf…

JAVA的SSH框架登錄注冊

Struts 的MVC設計模式可以使我們的邏輯變得很清晰&#xff0c;主要負責表示層的顯示。 Spring 的IOC和AOP可以使我們的項目在最大限度上解藕。 hibernate的就是實體對象的持久化了, 數據庫的封裝。 項目截圖&#xff1a;(代碼是按照項目截圖上傳的&#xff0c;直接對號入座即可…

Visual Studio Code 前端調試不完全指南

本文最初發布于我的個人博客&#xff1a;咀嚼之味Visual Studio Code (以下簡稱 vscode) 如今已經代替 Sublime&#xff0c;成為前端工程師們最喜愛的代碼編輯器。它作為一個大型的開源項目&#xff0c;不斷推陳出新&#xff1b;社區中涌現出大量優質的插件&#xff0c;以支持我…

MySQL中(delete、truncate、drop) 的區別

delete、truncate、drop的用法 MySQL 數據表中delete刪除數據的通用語法&#xff1a; ###刪除 students_tbl 表中 student_id 為3 的記錄&#xff1a; delete from students_tbl where student_id3; MySQL 數據表中truncate刪除數據的通用語法&#xff1a; ###刪除 students_…

機器學習之LDA主題模型算法

文章目錄1、知道LDA的特點和應用方向1.1、特點1.2、應用方向2、知道Beta分布和Dirichlet分布數學含義3、了解共軛先驗分布4、知道先驗概率和后驗概率5、知道參數α值的大小對應的含義6、掌握LDA主題模型的生成過程7、知道超參數α等值的參考值8、LDA總結1、知道LDA的特點和應用…

分別寫出引入CSS的3種方式, 特點, 優先級

第一&#xff1a;css的三種引入方式 1.行內樣式 最直接最簡單的一種&#xff0c;直接對HTML標簽使用style""&#xff0c;例如&#xff1a; <p style"color:#F00; "></p> 缺點&#xff1a;HTML頁面不純凈&#xff0c;文件體積大&#xff0c…

[Go] Template 使用簡介

Golang 提供了兩個標準庫用來處理模板 text/template 和 html/template。我們使用 html/template 格式化 html 字符。 模板引擎 模板引擎很多&#xff0c;Python 的 jinja&#xff0c;nodejs 的 jade 等都很好。所謂模板引擎&#xff0c;則將模板和數據進行渲染的輸出格式化后的…

內存泄露監測

2019獨角獸企業重金招聘Python工程師標準>>> iOS 內存泄露監測 144 作者 謝謝生活 已關注 2017.05.19 17:38* 字數 4235 閱讀 209評論 0喜歡 6 iOS可能存在的內存泄露&#xff1a;block 循環引用。當一個對象有一個block屬性&#xff0c;而block屬性又引用這個對象…

玩Azkaban跳過的坑

文章目錄一號坑&#xff1a;啟動Azkaban報錯&#xff1a;User xml file conf/azkaban-users.xml doesnt exist.二號坑&#xff1a;報錯&#xff1a;failed SslSocketConnector0.0.0.0:8443: java.io.FileNotFoundException: /home/hadoop/app/azkaban/azkaban-web-2.5.0/bin/ke…

兩種解除禁止右鍵、選中、復制的方法

我在網上找的 兩種解除禁止右鍵、選中、復制的方法 1、直接存到書簽點擊即可 javascript:(function(){var docdocument;var bddoc.body;bd.onselectstartbd.oncopybd.onpastebd.onkeydownbd.oncontextmenubd.onmousemovebd.onselectstartbd.ondragstartdoc.onselectstartdoc.o…

刪除節點removeChild()

http://www.imooc.com/code/1700 刪除節點removeChild() removeChild() 方法從子節點列表中刪除某個節點。如刪除成功&#xff0c;此方法可返回被刪除的節點&#xff0c;如失敗&#xff0c;則返回 NULL。 語法: nodeObject.removeChild(node) 參數: node &#xff1a;必需&…