2013-04-22 66 views
8

我正在做一些动手阅读AsyncTaskLoader,因此我可以使用该技术来加载联系人列表。代码工作的唯一时间是当我执行Fragment类中的回调时,如MyLoader extends Fragment implements LoaderCallbacks<ArrayList<Contact>>中的回调。有另一种方法吗?我真正需要的是联系人列表(姓名,电话,缩略图),发送到我的后端。例如,当我尝试使用Context时,由于我可以通过简单地做(Context)this从任何活动中获得该代码,所以代码甚至无法编译。我的意思是使用LoaderCallbacks而不使用片段

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

问题(再次):我可以使用AsyncTaskLoader没有片段或FragmentActivity?

THAT与该片作品CODE:

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" /> 
+0

@bossylobster,我一直在试图回应这一个,但我没有开它。任何输入?你的同事呢?得到我的是8级的api部分。它确实可以与片段一起工作,但显然没有其他的东西(请参考wangyif2的回复中的讨论)。 – 2013-04-22 20:30:31

回答

7

AsyncTaskLoader无关与您是否使用FragmentActivity

给你举一个例子,考虑清单活动:

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

显然,你需要创建列表视图和布局相应的适配器,但例如只是展示了如何对光标的一个简单的装载机将工作为一个活动。

此外,请确保您所有的进口是一致的,无论是使用support.v4库,或定期库:

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

被问另外一个问题,就是如果LoaderCallback接口,可独立使用。如果您认为LoaderCallback适用于此,则不推荐这样做。

The LoaderManager.LoaderCallbacks<D> interface is a simple contract that the LoaderManager uses to report data back to the client.这意味着什么,是它唯一的工作是由客户端,这是有效的,活动要求后台加载一些数据。

如果您创建独立类,您可以扩展类定义以实现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
  • Otto
  • Messenger

后您发送此信息的MainActivity,你可以将它装入适配器和继续是。

+1

非常感谢您的回复:+1。我现在添加了与Fragment和FragmentActivity配合使用的代码。如果'LoadingContacts'没有父活动(例如Fragment)和'MainActivity'没有扩展FragmentActivity,你是否介意将它编辑成你的答案以显示它的工作方式? – learner 2013-04-22 17:37:10

+2

让我明白你的问题,你想要一个'MainActivity'来扩展Activity和LoadContacts是纯粹的加载器而不是'Activity'或'Fragment'? – wangyif2 2013-04-22 17:40:10

+3

我很好奇,看看这会如何工作。 – 2013-04-22 17:40:56