• 目录结构:

  • 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. NOIP2014-9-6模拟赛

    工资 (money/money.in/money.out) 时限1000ms 内存256MB 聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可 ...

  2. [BZOJ]3527 力(ZJOI2014)

    第一次背出FFT模板,在此mark一道裸题. Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i ...

  3. python中type dtype astype 的用法

    1.type 获取数据类型 2.dtype 数组元素的类型 3.astype 修改数据类型

  4. Spring学习笔记2——创建Product对象,并在其中注入一个Category对象

    第一步:创建Product类.在Product类中有对Category对象的set和get方法 package com.spring.cate; public class Product { priv ...

  5. shell基本命令

    linux基本命令和shell基本命令,好多人傻傻分不清. linux基本命令积累如下: pwd:显示当前工作目录 cd:改变当前目录 ls:显示当前目录中所有目录文件和文本文件 ls -F:显示当前 ...

  6. SQL之LIMIT ,OFFSET

    SELECT prod_name FROM Products LIMIT OFFSET ; LIMIT 4 OFFSET 3指示MySQL等DBMS返回从第3行(从0行计数)起的4行数据.第一个数字是 ...

  7. Parallel.For 平行算法 使用

    之前看到Parallel的用法,觉得很高深,很腻害,今天专门抽空研究了一下,发现还是很easy的. .NET Framework 4.0 新加的功能,所以4.0之前的无法使用哦. 下面介绍一下,Par ...

  8. 73. Set Matrix Zeroes(中等)

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 重点是空间复 ...

  9. rhel7 配置普通用户使用sudo

    rhel服务器版本安装之后,默认创建的用户不能使用sudo.使用sudo,会提示 user1 is not in the sudoers file. This incident will be rep ...

  10. 基于无域故障转移群集 配置高可用SQLServer 2016数据库

    基于上次的文章搭建的环境,可以在这里:http://www.cnblogs.com/DragonStart/p/8275182.html看到上次的文章. 演示环境 1. 配置一览 Key Value ...