`
shuai1234
  • 浏览: 972505 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

LoaderManager的使用

 
阅读更多

  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, nullnullnull);
        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(1000nullthis);
    }
 
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
        CursorLoader loader = new CursorLoader(this,
                Uri.parse("content://com.app.contentprovider"), nullnull,
                nullnull);
        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的使用二源码

    在老罗的14.2 LoaderManager使用二的视频教程中,可能会详细讲解如何在实际项目中应用LoaderManager和CursorLoader,包括如何处理Activity或Fragment的生命周期变化,以及如何优化数据加载和刷新操作。通过学习这个...

    Android下使用loaderManager

    本篇文章将详细探讨Android下如何使用LoaderManager以及它的核心概念。 首先,LoaderManager是Android框架的一部分,它在Activity和Fragment中提供了一种统一的方式来加载和刷新数据。LoaderManager遵循Loader的...

    详细讲解Android中使用LoaderManager加载数据的方法

    首先,要使用LoaderManager,你需要获取它。在Activity中,你可以通过调用`getLoaderManager()`方法来获取LoaderManager实例。然后,你需要实现`LoaderManager.LoaderCallbacks&lt;D&gt;`接口,其中`D`代表你的数据类型。...

    Android 中 Loader 及 LoaderManager 的使用

    Loader是Android框架提供的一种异步加载数据的机制,而LoaderManager则是用来管理Loader的组件,它使得在Activity或Fragment中更加方便地使用Loader。 Loader的出现主要是为了解决AsyncTask在数据持久化和生命周期...

    LoaderManager查询联系人与图片

    LoaderManager的使用流程如下: 1. 在Activity或Fragment中初始化LoaderManager,通过getLoaderManager()方法获取LoaderManager实例。 2. 实现LoaderCallbacks接口,这个接口包含三个方法:onCreateLoader(), ...

    老罗android视频开发源码和ppt--LoaderManager异步加载数据库.rar

    老罗的视频开发源码和PPT将详细解析这一过程,通过实例代码和讲解,帮助开发者掌握LoaderManager的使用技巧,以及如何将其应用于数据库异步加载。通过学习这些材料,开发者不仅能理解LoaderManager的基本用法,还能...

    应用源码之30.Content_Providers(2).zip

    8. **CursorLoader**:异步加载数据的工具,通常配合LoaderManager使用,可以在后台加载数据并更新UI,避免主线程阻塞。 9. **ContentResolver**:其他应用与Content Provider交互的接口,调用它的方法即可查询、...

    ContentProvider的快速上手策略

    通常配合LoaderManager使用,提高用户体验。 3. **ContentProviderContract**:自定义接口,定义数据操作的规范。每个ContentProvider实现这个接口,以供外部应用调用。 4. **SQLite数据库**:ContentProvider通常...

    LoaderManagerExample

    本示例"LoaderManagerExample"旨在演示如何在实际项目中有效地使用LoaderManager。 LoaderManager的核心概念主要包括三个部分:Loader、LoaderManager和LoaderManager.LoaderCallbacks。Loader是数据加载的抽象接口...

    CursorAdapterTest:一个简单的演示使用 ContentProvider+LoaderManager+CursorAdapter for ListView

    ###使用了ContentProvider+LoaderManager+CursorAdapter,为ListView提供数据 ###为什么要这样做 传统的ListVIew更新数据操作麻烦,且在不同的线程中会产生问题 使用ContentProvider可以简化、结构化数据操作 通过...

    Android中使用Loader读取联系人信息(兼容低版本Android)

    本示例演示了在Android中如何使用Loader异步读取联系人数据,并且通过使用support v4支持低版本的Android系统(1.6+)。 该源码的详细解读可参见博文http://blog.csdn.net/iispring/article/details/48834767

    LoadSQLiteManager:用异步加载数据库(LoaderManager,ContentProvider,ContentResolver,SQLiteOpenHelper)

    `LoadSQLiteManager`是一个示例项目,展示了如何使用异步方式加载SQLite数据库,通过`LoaderManager`、`ContentProvider`、`ContentResolver`和`SQLiteOpenHelper`这四个关键组件来实现高效且响应迅速的数据管理。...

    Android 使用Loader 读取联系人

    4. **LoaderManager的使用**:在Activity或Fragment中,可以通过`getLoaderManager()`获取LoaderManager实例,然后使用`initLoader()`, `restartLoader()`或`getLoader()`方法启动、重启或获取Loader。 5. **Loader...

    android sqlite数据库升级及使用loader异步加载

    2. 在需要使用Loader的地方,通过LoaderManager的`getLoaderManager().initLoader()`或`restartLoader()`方法启动Loader。 3. 通过LoaderManager的`getLoaderManager().getLoader()`获取Loader实例,并通过`Loader....

    老罗android视频开发源码和ppt经典

    14.1 LoaderManager的使用一 14.2 LoaderManager的使用二 十五、多线程编程 15.1 AsyncTask异步任务介绍一 15.2 AsyTask异步任务介绍二 15.3 Handler和Message(一) 15.4 Handler和Message(二) 15.5 Handler和...

    android-关于ContentProvider的使用例子

    对于UI线程与数据加载的异步处理,推荐使用CursorLoader和LoaderManager。CursorLoader会在线程池中执行查询,LoaderManager负责管理Loader的生命周期,确保数据在后台加载且在UI准备好时可用。 8. **自定义...

    loader的使用

    - 应该在Fragment中使用Loader,因为LoaderManager是与Fragment关联的,而不是Activity。这样能更好地处理配置变更。 - 使用Loader搭配ContentProvider可以确保数据操作的安全性,避免并发问题。 - 使用Loader时...

    CursorAdapter和ListView结合使用

    2. **使用LoaderManager**:LoaderManager可以更好地管理Cursor的生命周期,特别是在Activity或Fragment的生命周期变化时。 3. **考虑性能优化**:避免在主线程中执行耗时的数据库操作,尽量使用异步查询。如果数据...

    Android-AndroidLoaderDemo演示CursorLoader和AsyncTaskLoader使用实例

    2. 在Activity或Fragment中初始化Loader并使用相同的LoaderManager.LoaderCallbacks接口。 3. 示例代码: ```java public class MyAsyncTaskLoader extends AsyncTaskLoader[]&gt; { @Override protected String[] ...

Global site tag (gtag.js) - Google Analytics