位于上海,服务全国!

位于上海,服务全国!

如何在Android应用中使用装载机异步加载数据

作者:admin 分类: 时间:2016-01-22 15:31:09 点击量:463
简要介绍在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