gpt4 book ai didi

android - 在没有 Fragment 的情况下使用 LoaderCallbacks

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:51:03 26 4
gpt4 key购买 nike

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

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 吗?

与 fragment 一起工作的代码:

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

}

list :

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

最佳答案

AsyncTaskLoader 与您是否使用 Fragment 无关。或 Activity .

举个例子,考虑一个列表 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);
}
}

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

此外,请确保所有导入都是一致的,或者使用 support.v4图书馆,或普通图书馆:

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

另一个被问到的问题是,如果 LoaderCallback接口(interface)可以独立使用。如果您认为 LoaderCallback 不建议这样做是为了。

The LoaderManager.LoaderCallbacks<D> interface is a simple contract that the LoaderManager uses to report data back to the client.这意味着,它的唯一工作是在客户端请求的后台加载一些数据,这实际上是一个 Activity 。

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

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

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
  • Otto
  • Messenger

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

关于android - 在没有 Fragment 的情况下使用 LoaderCallbacks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16152266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com