android的设计之中,任何耗时的操作都不能放在UI主线程之中。所以类似于网络操作等等耗时的操作都需要使用异步的实现。而在ContentProvider之中,也有可能存在耗时的操作(当查询的数据量很大的时候),这个时候我们也需要使用异步的调用来完成数据的查询。
当使用异步的query的时候,我们就需要使用LoaderManager了。使用LoaderManager就可以在不阻塞UI主线程的情况下完成数据的加载。
1)获取loaderManger:activity.getLoaderManager()
2)loaderManager的事件回调接口, LoaderManager.LoaderCallbacks<D>
下面是一个demo,从contentprovider中query数据添加到listview中,是异步执行的。
MySQLiteOpenHeleper.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.app.loadermanager;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
public static final String db_name = "test.db3" ;
public static final int version = 1 ;
public MySQLiteOpenHelper(Context context) {
super (context, db_name, null , version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String create_sql = "create table tb_student(_id integer primary key autoincrement,name varchar(20),age integer)" ;
db.execSQL(create_sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
} |
MyContentProvider.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package com.app.loadermanager;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class MyContentProvider extends ContentProvider {
private MySQLiteOpenHelper helper = null ;
private static final UriMatcher matcher = new UriMatcher(
UriMatcher.NO_MATCH);
private static final int students = 1 ;
static {
matcher.addURI( "com.app.contentprovider" , "tb_student" , students);
}
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
return 0 ;
}
@Override
public String getType(Uri arg0) {
return null ;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = helper.getWritableDatabase();
int flag = matcher.match(uri);
switch (flag) {
case students:
long id = db.insert( "tb_student" , null , values);
return ContentUris.withAppendedId(uri, id);
}
return null ;
}
@Override
public boolean onCreate() {
helper = new MySQLiteOpenHelper( this .getContext());
return true ;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor=db.query( "tb_student" , projection, selection, selectionArgs, null , null , null );
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0 ;
}
} |
MainActivity.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
package com.app.loadermanager;
import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
@SuppressLint ( "NewApi" )
public class MainActivity extends Activity implements
LoaderManager.LoaderCallbacks<Cursor> {
LoaderManager manager = null ;
ListView listView = null ;
@SuppressLint ( "NewApi" )
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) this .findViewById(R.id.listview);
manager = this .getLoaderManager();
manager.initLoader( 1000 , null , this );
}
@Override
public Loader<Cursor> onCreateLoader( int id, Bundle bundle) {
CursorLoader loader = new CursorLoader( this ,
Uri.parse( "content://com.app.contentprovider" ), null , null ,
null , null );
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
ArrayList<String> al = new ArrayList<String>();
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex( "name" ));
al.add(name);
}
ArrayAdapter adapter= new ArrayAdapter( this ,android.R.layout.simple_list_item_1,al);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
} |
相关推荐
在老罗的14.2 LoaderManager使用二的视频教程中,可能会详细讲解如何在实际项目中应用LoaderManager和CursorLoader,包括如何处理Activity或Fragment的生命周期变化,以及如何优化数据加载和刷新操作。通过学习这个...
本篇文章将详细探讨Android下如何使用LoaderManager以及它的核心概念。 首先,LoaderManager是Android框架的一部分,它在Activity和Fragment中提供了一种统一的方式来加载和刷新数据。LoaderManager遵循Loader的...
首先,要使用LoaderManager,你需要获取它。在Activity中,你可以通过调用`getLoaderManager()`方法来获取LoaderManager实例。然后,你需要实现`LoaderManager.LoaderCallbacks<D>`接口,其中`D`代表你的数据类型。...
Loader是Android框架提供的一种异步加载数据的机制,而LoaderManager则是用来管理Loader的组件,它使得在Activity或Fragment中更加方便地使用Loader。 Loader的出现主要是为了解决AsyncTask在数据持久化和生命周期...
LoaderManager的使用流程如下: 1. 在Activity或Fragment中初始化LoaderManager,通过getLoaderManager()方法获取LoaderManager实例。 2. 实现LoaderCallbacks接口,这个接口包含三个方法:onCreateLoader(), ...
老罗的视频开发源码和PPT将详细解析这一过程,通过实例代码和讲解,帮助开发者掌握LoaderManager的使用技巧,以及如何将其应用于数据库异步加载。通过学习这些材料,开发者不仅能理解LoaderManager的基本用法,还能...
8. **CursorLoader**:异步加载数据的工具,通常配合LoaderManager使用,可以在后台加载数据并更新UI,避免主线程阻塞。 9. **ContentResolver**:其他应用与Content Provider交互的接口,调用它的方法即可查询、...
通常配合LoaderManager使用,提高用户体验。 3. **ContentProviderContract**:自定义接口,定义数据操作的规范。每个ContentProvider实现这个接口,以供外部应用调用。 4. **SQLite数据库**:ContentProvider通常...
本示例"LoaderManagerExample"旨在演示如何在实际项目中有效地使用LoaderManager。 LoaderManager的核心概念主要包括三个部分:Loader、LoaderManager和LoaderManager.LoaderCallbacks。Loader是数据加载的抽象接口...
###使用了ContentProvider+LoaderManager+CursorAdapter,为ListView提供数据 ###为什么要这样做 传统的ListVIew更新数据操作麻烦,且在不同的线程中会产生问题 使用ContentProvider可以简化、结构化数据操作 通过...
本示例演示了在Android中如何使用Loader异步读取联系人数据,并且通过使用support v4支持低版本的Android系统(1.6+)。 该源码的详细解读可参见博文http://blog.csdn.net/iispring/article/details/48834767
`LoadSQLiteManager`是一个示例项目,展示了如何使用异步方式加载SQLite数据库,通过`LoaderManager`、`ContentProvider`、`ContentResolver`和`SQLiteOpenHelper`这四个关键组件来实现高效且响应迅速的数据管理。...
4. **LoaderManager的使用**:在Activity或Fragment中,可以通过`getLoaderManager()`获取LoaderManager实例,然后使用`initLoader()`, `restartLoader()`或`getLoader()`方法启动、重启或获取Loader。 5. **Loader...
2. 在需要使用Loader的地方,通过LoaderManager的`getLoaderManager().initLoader()`或`restartLoader()`方法启动Loader。 3. 通过LoaderManager的`getLoaderManager().getLoader()`获取Loader实例,并通过`Loader....
14.1 LoaderManager的使用一 14.2 LoaderManager的使用二 十五、多线程编程 15.1 AsyncTask异步任务介绍一 15.2 AsyTask异步任务介绍二 15.3 Handler和Message(一) 15.4 Handler和Message(二) 15.5 Handler和...
对于UI线程与数据加载的异步处理,推荐使用CursorLoader和LoaderManager。CursorLoader会在线程池中执行查询,LoaderManager负责管理Loader的生命周期,确保数据在后台加载且在UI准备好时可用。 8. **自定义...
- 应该在Fragment中使用Loader,因为LoaderManager是与Fragment关联的,而不是Activity。这样能更好地处理配置变更。 - 使用Loader搭配ContentProvider可以确保数据操作的安全性,避免并发问题。 - 使用Loader时...
2. **使用LoaderManager**:LoaderManager可以更好地管理Cursor的生命周期,特别是在Activity或Fragment的生命周期变化时。 3. **考虑性能优化**:避免在主线程中执行耗时的数据库操作,尽量使用异步查询。如果数据...
2. 在Activity或Fragment中初始化Loader并使用相同的LoaderManager.LoaderCallbacks接口。 3. 示例代码: ```java public class MyAsyncTaskLoader extends AsyncTaskLoader[]> { @Override protected String[] ...