• 目录结构:

  • MainActivity.java 代码:

    package com.qf.day18_loader_demo2;
    
    import android.app.Activity;
    import android.app.LoaderManager.LoaderCallbacks;
    import android.content.Loader;
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Handler;
    import android.widget.ListView;
    import android.widget.SearchView;
    import android.widget.SearchView.OnQueryTextListener;
    import android.widget.SimpleCursorAdapter; public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{ private ListView lv;
    private SimpleCursorAdapter adapter; private SearchView sv; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv);
    sv = (SearchView) findViewById(R.id.sv); sv.setOnQueryTextListener(new OnQueryTextListener() { @Override
    public boolean onQueryTextSubmit(String query) {
    // TODO Auto-generated method stub
    return false;
    } @Override
    public boolean onQueryTextChange(String newText) {
    // TODO Auto-generated method stub Bundle bundle = new Bundle();
    bundle.putString("key", newText.toString()); getLoaderManager().restartLoader(1, bundle, MainActivity.this);
    return false;
    }
    }); adapter = new SimpleCursorAdapter(
    MainActivity.this, R.layout.item,null,
    new String[]{"address","body"},
    new int[]{R.id.tv_adress,R.id.tv_body},
    SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); lv.setAdapter(adapter); //初始化Loader对象
    getLoaderManager().initLoader(1, null, this); /**
    * 注册观察者对象 给当前Uri
    * 参数1:Uri对象
    * 参数2: 如果返回true 检测到 content:sms content:sms/address content:sms/address/iii
    * 如果返回false 只能检测到当前的content:sms
    *
    * 参数3:观察者
    *
    */
    getContentResolver().registerContentObserver(
    Uri.parse("content://sms"), true, new MyContentObserver(null));
    } @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // 实例化Loader对象 并返回
    SmsLoader smsLoader = new SmsLoader(MainActivity.this,args);
    return smsLoader;
    //看个人喜好情况使用 两种方式 如果使用以下方式 请删除上面的
    // Uri smsUri = Uri.parse("content://sms");
    // String[] colums = {"_id","address","body"};
    // String selection = null;
    // String[] selectionArgs = null;
    //
    // CursorLoader cursorLoader = new CursorLoader(MainActivity.this, smsUri, colums, selection, selectionArgs, null);
    // return cursorLoader;
    } @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // TODO Auto-generated method stub
    adapter.swapCursor(data);
    } @Override
    public void onLoaderReset(Loader<Cursor> loader) {
    // TODO Auto-generated method stub
    adapter.swapCursor(null);
    } /**
    * 自定义的观察者
    * @author sxy
    *
    */
    class MyContentObserver extends ContentObserver{ public MyContentObserver(Handler handler) {
    super(handler);
    // TODO Auto-generated constructor stub
    } //当你的数据发生改变时 调用此方法
    @Override
    public void onChange(boolean selfChange) {
    // TODO Auto-generated method stub
    super.onChange(selfChange);
    //重启Loader
    getLoaderManager().restartLoader(1, null, MainActivity.this);
    } } }
  • SmsLoader.java

    package com.qf.day18_loader_demo2;
    
    import android.content.AsyncTaskLoader;
    import android.content.Context;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.util.Log; /**
    * 自定义的AsyncTaskLoader
    *
    *
    */
    public class SmsLoader extends AsyncTaskLoader<Cursor> { private Uri smsUri = Uri.parse("content://sms");
    private String[] colums = {"_id","address","body"};
    private String selection = null;
    private String[] selectionArgs = null; // private Bundle bundle; public SmsLoader(Context context,Bundle bundle) {
    super(context);
    // TODO Auto-generated constructor stub
    // this.bundle = bundle;
    if(bundle!=null){
    selection = "body like ?";
    selectionArgs = new String[]{"%"+bundle.getString("key")+"%"};
    }
    } /**
    * Ui线程执行
    */
    @Override
    protected void onStartLoading() {
    // TODO Auto-generated method stub
    super.onStartLoading(); Log.e("AAA", "==>"+Thread.currentThread().getName());
    forceLoad();//必须执行 强制向下执行 不然此类无效
    } /**
    * 耗时操作 工作线程 可以执行查询操作
    */
    @Override
    public Cursor loadInBackground() {
    // TODO Auto-generated method stub Log.e("AAA", "==>"+Thread.currentThread().getName());
    // Log.e("AAA", "=selection=>"+selection);
    // Log.e("AAA", "=selectionArgs=>"+selectionArgs[0]);
    Cursor cursor = getContext().getContentResolver().query(
    smsUri, colums, selection, selectionArgs, null); return cursor;
    } }
  • activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" > <SearchView
    android:id="@+id/sv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ></SearchView> <ListView
    android:id="@+id/lv"
    android:layout_width="match_parent"
    android:layout_height="match_parent" /> </LinearLayout>
  • item.xml

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

18 Loader代码案例的更多相关文章

  1. 项目使用Hbase进行数据快速查询的代码案例

    之前项目中对于数据详情的查询使用的ddb技术,由于成本过高,现考虑使用开源的hbase框架,借此机会进行hbase的代码案例记录,之前已经对 hbase的原理进行介绍,介绍了hbase中的rowkey ...

  2. Android清除本地数据缓存代码案例

    Android清除本地数据缓存代码案例 直接上代码: /*  * 文 件 名:  DataCleanManager.java  * 描    述:  主要功能有清除内/外缓存,清除数据库,清除shar ...

  3. spring_boot_pay支付宝,微信,银联支付详细代码案例

    spring-boot-pay 支付服务:支付宝,微信,银联详细代码案例(除银联支付可以测试以外,支付宝和微信支付测试均需要企业认证,个人无法完成测试),项目启动前请仔细阅读 注意事项  . 友情提示 ...

  4. hadoop一代集群运行代码案例

    hadoop一代集群运行代码案例 集群 一个 master,两个slave,IP分别是192.168.1.2.192.168.1.3.192.168.1.4               hadoop版 ...

  5. jwt 0.9.0(三)jwt客户端存储状态可行性分析,及Java代码案例

    Jwt客户端存储状态可行性分析 1.前端首次访问后台,后台生成token,放在http header的Authorization里(官网推荐,可解决跨域cookie跨域问题),并且Authorizat ...

  6. Python使用pyexecjs代码案例解析

    针对现在大部分的网站都是使用js加密,js加载的,并不能直接抓取出来,这时候就不得不适用一些三方类库来执行js语句 execjs,一个比较好用且容易上手的类库(支持py2,与py3),支持 JS ru ...

  7. 23个phpcms v9模板制作及二次开发常用代码案例

    0:调用最新文章,带所在版块 {pc:get sql="SELECT a.title, a.catid, b.catid, b.catname, a.url as turl ,b.url a ...

  8. PHPMailer < 5.2.18 远程代码执行漏洞(CVE-2016-10033)

    PHPMailer < 5.2.18 Remote Code Execution 本文将简单展示一下PHPMailer远程代码执行漏洞(CVE-2016-10033)的利用过程,使用的是别人已经 ...

  9. PHP多进程学习(三)__代码案例来了解父进程与子进程的执行顺序

    pcntl_fork创建子进程成功的话,系统就有了2个进程,一个为父进程,一个为子进程,父进程和子进程都继续向下执行,子进程的id号为$pid(父进程会获取子进程的$pid也就是$pid不为0,而子进 ...

随机推荐

  1. ●CodeForces 549F Yura and Developers

    题链: http://codeforces.com/problemset/problem/549/F题解: 分治,链表. 考虑对于一个区间[L,R],其最大值在p位置, 那么答案的贡献就可以分为3部分 ...

  2. [bzoj4908][BeiJing2017]开车

    来自FallDream的博客,未经允许,请勿转载,谢谢. 你有n辆车,分别a1, a2, ..., an位置和n个加油站,分别在b1, b2, ... ,bn .每个加油站只能支持一辆车的加油,所以你 ...

  3. 基于 HTML5 的 WebGL 3D 智能楼宇监控系统

    前言 智能监控的领域已经涉及到了各大领域,工控.电信.电力.轨道交通.航天航空等等,为了减少人员的消耗,监控系统必不可少.之前我写过一篇 2D 的智能地铁监控系统广受好评,突然觉得,既然 2D 的这么 ...

  4. C语言中#define的用法

    今天整理了一些#define的用法,与大家共享! 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i& ...

  5. ES6(数值)

    数值处理新增特性: 1.新增方法 2.方法调整 1.二进制和八进制 二进制以 0b 开头,其中B和b都可以:八进制以 0o 开头,其中O和o都可以. 2.判断数值是否有效(有限) NaN为非数字,故为 ...

  6. Recycleview实现复杂布局

    Recycleview实现复杂布局 首先 附上Demo链接和效果供大家参考 Demo 实现思路 代码思考 时间是一切财富中最宝贵的财富. -- 德奥弗拉斯多 <a 实现思路 开始看到设计稿子的时 ...

  7. Java transient关键字使用小结

      1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的.2.被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被t ...

  8. li标签中list-style-image如何居中

    使用list-style-image设置了一个列表项的小图标时,一直不能让图标居中的显示. 解决办法是:使用ul li的backgrou-image(背景图片)来设置. 代码如下: ul li{ he ...

  9. Linux下查看alert日志文件的两种方法

    --linux下查看alert日志文件的两种方法: --方法1: SQL> show parameter background_dump_dest; NAME TYPE VALUE ------ ...

  10. 【kmp】 剪花布条 HDU - 2087

    [题意概述] [解题思路] 从左往右找,看有几个匹配的字符串,但要注意例如 aaaaaa  aa的输出是3 而不是5,可以这样理解:画布需要减去,一旦减去也就没有了的 [AC] #include< ...