Android 使用不带片段的LoaderCallbacks
我正在AsyncTaskLoader上进行一些实际阅读,以便使用该技术加载联系人列表。代码工作的唯一时间是当我从扩展Android 使用不带片段的LoaderCallbacks,android,android-contacts,asynctaskloader,Android,Android Contacts,Asynctaskloader,我正在AsyncTaskLoader上进行一些实际阅读,以便使用该技术加载联系人列表。代码工作的唯一时间是当我从扩展Fragment的类实现回调时,就像在MyLoader extends Fragment实现LoaderCallbacks中一样 问题(再次):我可以在没有片段或碎片活动的情况下使用AsyncTaskLoader吗 与片段一起工作的代码: package com.example.contactpreload.utils; import java.util.ArrayList;
Fragment
的类实现回调时,就像在MyLoader extends Fragment实现LoaderCallbacks中一样
问题(再次):我可以在没有片段或碎片活动的情况下使用AsyncTaskLoader吗
与片段一起工作的代码:
package com.example.contactpreload.utils;
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
public class LoadingContacts extends Fragment implements LoaderCallbacks<ArrayList<Contact>> {
ArrayList<Contact> loadedContacts;
static Fragment fragmentActivity;
public static LoadingContacts newInstance(int arg) {
LoadingContacts f = new LoadingContacts();
Bundle bundle = new Bundle();
bundle.putInt("index", arg);
f.setArguments(bundle);
fragmentActivity = new Fragment();
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("onCreate()");
int mIndex = getArguments().getInt("index");
System.out.println(mIndex);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
System.out.println("onActivityCreated()");
getLoaderManager().initLoader(1, null, this);
}
@Override
public Loader<ArrayList<Contact>> onCreateLoader(int arg0, Bundle arg1) {
System.out.println("onCreateLoader()");
return new ContactsLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<ArrayList<Contact>> loader, ArrayList<Contact> data) {
loadedContacts = data;
System.out.println("AND THE CONTACTS ARE: ");
for (Contact c : loadedContacts) {
System.out.println("NAME: " + c.getName());
System.out.println("getPhoneNumberHome: " + c.getPhoneNumber());
}
}
@Override
public void onLoaderReset(Loader<ArrayList<Contact>> arg0) {
System.out.println("onLoaderReset()");
// TODO Auto-generated method stub
}
}
package com.example.contactpreload;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import com.example.contactpreload.utils.LoadingContacts;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoadingContacts fragment = LoadingContacts.newInstance(1);
fragment.setRetainInstance(true);
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content, fragment).commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
package com.example.contactpreload.utils;
导入java.util.ArrayList;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.LoaderManager.LoaderCallbacks;
导入android.support.v4.content.Loader;
公共类LoadingContacts扩展片段实现LoaderCallbacks{
ArrayList加载的联系人;
静态片段断裂活性;
公共静态加载联系人newInstance(int arg){
LoadingContacts f=新的LoadingContacts();
Bundle=新Bundle();
bundle.putInt(“索引”,arg);
f、 setArguments(bundle);
fragmentActivity=新片段();
返回f;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
System.out.println(“onCreate()”);
int mIndex=getArguments().getInt(“索引”);
系统输出打印LN(mIndex);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
System.out.println(“onActivityCreated()”;
getLoaderManager().initLoader(1,null,this);
}
@凌驾
公共加载器onCreateLoader(int arg0,Bundle arg1){
System.out.println(“onCreateLoader()”);
返回新的ContactsLoader(getActivity());
}
@凌驾
public void onLoadFinished(加载程序、ArrayList数据){
loadedContacts=数据;
System.out.println(“联系人为:”);
用于(联系人c:加载的联系人){
System.out.println(“NAME:+c.getName());
System.out.println(“getPhoneNumberHome:+c.getPhoneNumber());
}
}
@凌驾
公共void onLoaderReset(加载程序arg0){
System.out.println(“onLoaderReset()”;
//TODO自动生成的方法存根
}
}
包com.example.contactpreload;
导入android.os.Bundle;
导入android.support.v4.app.FragmentActivity;
导入android.view.Menu;
导入com.example.contactpreload.utils.LoadingContacts;
公共类MainActivity扩展了FragmentActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoadingContacts片段=LoadingContacts.newInstance(1);
fragment.setRetainInstance(真);
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content,fragment).commit();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
}
舱单:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
AsyncTaskLoader与您使用的是片段
还是活动
无关
给你一个例子,考虑一个列表活动:
public class ExampleActivity extends ListActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.todo_list);
//to start the loader:
getLoaderManager().initLoader(0, null, this);
}
//override the loader callback methods as usual
// Creates a new loader after the initLoader () call
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader cursorLoader = new CursorLoader(this,
uri, projection, null, null, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// data is not available anymore, delete reference
adapter.swapCursor(null);
}
}
另一个问题是,如果LoaderCallback
接口可以独立使用。如果您认为<代码> LoaderCallback <代码>是不适用的,这是不推荐的。
这意味着,它唯一的任务就是在客户端请求的后台加载一些数据,这实际上是一个活动
如果创建独立类,则可以扩展类定义以实现LoaderManager.LoaderCallbacks
,但需要通过某种机制将加载的数据报告回原始活动,这将使简单的任务变得复杂
现在,如果您确实固定要这样做,您可以创建独立类,如下所示:
public class LoadingContacts implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
}
公共类LoadingContacts实现LoaderManager.LoaderCallbacks{
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回null;
}
@凌驾
public void onLoadFinished(加载器、光标数据){
}
@凌驾
公共void onLoaderReset(加载器){
}
}
在您的onload finished
方法中,您需要通过广播或某种消息总线将加载的光标
发回:
LocalBroadcastManager
Messenger
将此信息发送到main活动
后,您可以将其加载到适配器并按原样继续。非常感谢您的回复:+1。我现在已经添加了用于片段和FragmentActivity的代码。如果LoadingContacts
没有父活动(例如Fragment)并且main活动
没有扩展FragmentActivity,您是否介意将其编辑到您的答案中,以显示它将如何工作?请让我了解您的问题,你想让main活动
扩展Activity
和LoadingContacts
成为纯粹的加载器,而不是Activity
或片段
?我已经更新了答案,请检查你的问题是否得到了回答。我决定使用你的示例,但它抱怨getLoaderManager().initLoader(0,null,this)
应该有一个min API 11而不是8。从ListActivity更改到Activity没有任何区别。它在您的系统上使用min API 8编译吗?参考android文档,Loader
是在API 11中引入的,在该API级别之前,使用了ManagedCursor
。@bossylobster,我一直在尝试对此作出回应一个,但我没有破解它。有任何输入吗?你的同事呢?让我感兴趣的是8级api部分。它确实可以使用片段,但没有任何el
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
public class LoadingContacts implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
}