简要介绍在Android中异步加载数据
装载机是一个Android结构,它可以很容易以异步方式加载一个活动或片段的数据。
装载机可以绑定到数据源,并且当内容在数据源中变化时,他们可以提供刷新的结果。 此外,它们保持连接的光标上下文,并且当它们重新连接,他们并不需要重新查询数据。
每个活动或片段可以具有至多一个LoaderManager类,其可用于管理装载机实例。 通常情况下,在Android应用程序中使用装载机,我们需要如下:
活动或片段类
LoaderManager的实例
CursorLoader类加载数据
小工具以显示加载数据
数据源
通过Android装载机的递交
让我们创建一个简单的Android应用程序,以演示装载机的工作。
启动Android工作室,并创建一个新的Android项目。
图1:打开Android工作室
提供装载机演示作为应用程序的名称,然后单击下一步。
图2:应用程序的命名
在下一屏幕上,保留默认值,然后单击下一步。
图3:保留默认值到位
在“添加一个活动至移动”页面,选择“空白活动”。 这将创建一个单一活动的应用程序。
图4:添加一个空活动
然后,我们激起定制活动。 我们将保留默认值不变。
图5:再次,保留默认值到位
点击Finish创建项目文件。
首先,我们声明读取应用程序清单联系人的能力
//AndroidManifest.xml
package="com.example.vipul.loaderdemo" >
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:name=".MainActivity"
android:label="@string/app_name" >
然后,我们更新布局文件,以添加一个ListView。
//activitymain.xml
"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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="122dp" />
打开MainActivity.java并包括一些引入。
//MainActivity.java
import android.app.ListActivity;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.LoaderManager.LoaderCallbacks;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
接下来,我们更新类声明,以扩展LoaderCallbacks。
public class MainActivity
extends ListActivity
implements LoaderCallbacks{
然后,我们添加一些成员变量。
CursorLoader myCursorLoader;
String currentFilter;
SimpleCursorAdapter myDisplayAdapter;
ListView yourListView = getListView();
static final String[] CONTACTS_SUMMARY_PROJECTION =
new String[]{
Contacts._ID,
Contacts.DISPLAY_NAME
};
接下来,我们在onCreate方法内更新默认代码以初始化loadermanager:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
yourListView = getListView();
myDisplayAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, null,
new String[] { Contacts.DISPLAY_NAME},
new int[] { android.R.id.text1}, 0);
setListAdapter(myDisplayAdapter);
getLoaderManager().initLoader(0, null, this);
}
最后,我们执行了加载程序的回调方法。
// This method is called when initLoader is invoked.
// In this method, we create the CursorLoader
@Override
public LoaderonCreateLoader(int id, Bundle args) {
// Create a cursor
// uri: The URI for the content to retrieve.
// projection: A list of which columns to return.
// Passing null will return all columns,
// which is inefficient.
// selection: A filter declaring which rows to return,
// formatted as an SQL WHERE clause (excluding the WHERE itself).
// Passing null will return all rows for the given URI.
// selectionArgs: You may include ?s in the selection,
// which will be replaced by the values from selectionArgs,
// in the order that they appear in the selection.
// The values will be bound as Strings.
// sortOrder: How to order the rows, formatted as an SQL ORDER BY
// clause (excluding the ORDER BY itself). Passing null will use
// the default sort order, which may be unordered.
Uri baseUri;
if (currentFilter != null) {
baseUri = Uri.withAppendedPath
(ContactsContract.Contacts.CONTENT_FILTER_URI,
Uri.encode(currentFilter));
} else {
baseUri = ContactsContract.Contacts.CONTENT_FILTER_URI;
}
String select = "((" + Contacts.DISPLAY_NAME
+ " NOTNULL) AND ("
+ Contacts.HAS_PHONE_NUMBER + "=1) AND ("
+ Contacts.DISPLAY_NAME + " != '' ))";
myCursorLoader = new CursorLoader(this,
baseUri,CONTACTS_SUMMARY_PROJECTION, select, null,
Contacts.DISPLAY_NAME + " ASC");
return myCursorLoader;
}
在onLoadFinished回调时,我们交换光标数据。
@Override
public void onLoadFinished(Loaderloader, Cursor data) {
myDisplayAdapter.swapCursor(data);
}
在onLoadFinished回调,我们设置交换为空。
@Override
public void onLoaderReset(Loaderloader) {
myDisplayAdapter.swapCursor(null);
}
我们的应用程序已完成。 当你运行它,你会看到在运行时的装载机。
总结
在本文中,我们学习了如何使用加载器来异步加载Android应用程序数据。 我希望这篇文章对你有帮助。
http://www.developer.com/ws/android/programming/how-to-load-data-asynchronously-in-android-apps-using-loaders.html