Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用不带片段的LoaderCallbacks_Android_Android Contacts_Asynctaskloader - Fatal编程技术网

Android 使用不带片段的LoaderCallbacks

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;

我正在AsyncTaskLoader上进行一些实际阅读,以便使用该技术加载联系人列表。代码工作的唯一时间是当我从扩展
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) {
}
}