18 Loader代码案例
目录结构:
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代码案例的更多相关文章
- 项目使用Hbase进行数据快速查询的代码案例
之前项目中对于数据详情的查询使用的ddb技术,由于成本过高,现考虑使用开源的hbase框架,借此机会进行hbase的代码案例记录,之前已经对 hbase的原理进行介绍,介绍了hbase中的rowkey ...
- Android清除本地数据缓存代码案例
Android清除本地数据缓存代码案例 直接上代码: /* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除shar ...
- spring_boot_pay支付宝,微信,银联支付详细代码案例
spring-boot-pay 支付服务:支付宝,微信,银联详细代码案例(除银联支付可以测试以外,支付宝和微信支付测试均需要企业认证,个人无法完成测试),项目启动前请仔细阅读 注意事项 . 友情提示 ...
- hadoop一代集群运行代码案例
hadoop一代集群运行代码案例 集群 一个 master,两个slave,IP分别是192.168.1.2.192.168.1.3.192.168.1.4 hadoop版 ...
- jwt 0.9.0(三)jwt客户端存储状态可行性分析,及Java代码案例
Jwt客户端存储状态可行性分析 1.前端首次访问后台,后台生成token,放在http header的Authorization里(官网推荐,可解决跨域cookie跨域问题),并且Authorizat ...
- Python使用pyexecjs代码案例解析
针对现在大部分的网站都是使用js加密,js加载的,并不能直接抓取出来,这时候就不得不适用一些三方类库来执行js语句 execjs,一个比较好用且容易上手的类库(支持py2,与py3),支持 JS ru ...
- 23个phpcms v9模板制作及二次开发常用代码案例
0:调用最新文章,带所在版块 {pc:get sql="SELECT a.title, a.catid, b.catid, b.catname, a.url as turl ,b.url a ...
- PHPMailer < 5.2.18 远程代码执行漏洞(CVE-2016-10033)
PHPMailer < 5.2.18 Remote Code Execution 本文将简单展示一下PHPMailer远程代码执行漏洞(CVE-2016-10033)的利用过程,使用的是别人已经 ...
- PHP多进程学习(三)__代码案例来了解父进程与子进程的执行顺序
pcntl_fork创建子进程成功的话,系统就有了2个进程,一个为父进程,一个为子进程,父进程和子进程都继续向下执行,子进程的id号为$pid(父进程会获取子进程的$pid也就是$pid不为0,而子进 ...
随机推荐
- [HNOI2013]比赛
题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得1分. (3) ...
- 【Peaks加强版 BZOJ 3551】你被坑了吗?
这道在没加读入优化时间在20s左右的题终于在大米饼两天的死缠烂打.鬼混.乱整乱撞后艰难地AC了.但惋惜的是,大米饼一号代码其实更加简洁,但至今找不出BUG,我将它放在下面,也许有一天从远方来的另一个大 ...
- BZOJ2989 数列(二进制分组)
这题其实可以cdq分治做,但是如果强制在线的话,这里有个牛逼方法叫二进制分组. 它的基本思想是把修改操作按二进制分组,遇到修改就在尾部加一个,并与之前的合并,比如之前有23(16+4+2+1)个,加了 ...
- Python3 sys.argv[ ]的用法解释
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,所以那些试图从代码来说明它作用的解释一直没看明白.因为我们从外部取得的参数可以是多个,所以获得的是一 ...
- ORACLE 启动过程
1 STARTUP NOMOUNT 1.读取环境变量下dbs目录下的参数文件(spfile/pfile) 查找参数文件的顺序如上面列表的,读取优先级: spfilechongshi.ora > ...
- SpringBoot添加自定义拦截器
拦截器的主要作用是拦截用户的请求并做相应的处理,如判断用户是否登录,用户是否具有操作权限等等. 实现 HandlerInterceptor 接口来拦截请求 public class MyInterce ...
- 笔记10 在XML中声明切面(1)
1.无注解的Audience package XMLconcert; public class Audience { public void silenceCellPhones() { System. ...
- 第一节mysql 安装
1 安装之前的检查 先要检查Linux系统中是否已经安装了MySQL,输入命令尝试打开MySQL服务: 输入密码后,如果出现以下提示,则说明系统中已经安装有 MySQL: 如果提示是这样的,则说明系统 ...
- 阿里Java研发工程师实习面经
十分幸运 拿到阿里云的offer,感谢周围无数人对我的支持和鼓励,所以写篇面经希望可以帮助大家. 面试中,运气占很大一部分的,所以你们若是没有通过,一定不要气馁,继续加油. 每个努力的人 都值得钦佩, ...
- linux route 路由设置小记
情景一: 有一台ip为172.16.160.53服务器,此服务器为固定ip,由于某些特殊情况,此服务器的ip不能修改. 现在这台服务器需要与另外一个网段ip为172.16.176.150服务器进行局域 ...