8

我正在对 AsyncTaskLoader 进行一些动手阅读,以便我可以使用该技术来加载联系人列表。代码工作的唯一时间是当我从扩展Fragment为 in的类中实现回调时MyLoader extends Fragment implements LoaderCallbacks<ArrayList<Contact>>。还有其他方法吗?我真正需要的只是将联系人列表(姓名、电话、缩略图)发送到我的后端。例如,当我尝试使用Context时,因为我可以通过简单地从任何活动中获取它(Context)this,所以代码甚至无法编译。我的意思是上下文

context.getLoaderManager().initLoader(1, null, this);
//I already changed to Fragment so don't really remember the exact ".context" line.
//But someone who has done this will understand the snippet.

顺便说一句:我正在使用多个参考。一个是http://developer.android.com/reference/android/content/AsyncTaskLoader.html

问题(再次):我可以在没有 Fragment 或 FragmentActivity 的情况下使用 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;
    }

}

显现:

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />
4

1 回答 1

7

AsyncTaskLoader 与您使用的是 aFragment还是Activity.

举个例子,考虑一个列表活动:

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);
     }
}

显然,您需要为列表视图和布局创建相应的适配器,但该示例仅向您展示了一个简单的光标加载器如何为 Activity 工作。

此外,请确保您的所有导入都是一致的,无论是使用support.v4库还是常规库:

import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;

另一个问题是LoaderCallback接口是否可以独立使用。如果您认为LoaderCallback是 for,则不建议这样做。

LoaderManager.LoaderCallbacks<D>接口是 LoaderManager 用来向客户端报告数据的简单协定。这意味着,它的唯一工作是在客户端请求的后台加载一些数据,这实际上是一个活动。

如果你创建一个独立的类,你可以扩展类定义来实现LoaderManager.LoaderCallbacks<D>,但是你需要通过某种机制将加载的数据报告回原始活动,这会使一个简单的任务复杂化。

现在,如果您真的固定在这样做,您可以这样创建您的独立类:

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) {
}
}

在您的onLoadFinished方法中,您需要Cursor通过广播或某种消息总线将加载的内容发送回:

  • LocalBroadcastManager
  • 奥托
  • Messenger

将此信息发送到 后MainActivity,您可以将其加载到适配器并按原样继续。

于 2013-04-22T17:25:03.963 回答